Convert DateTime to Utc only if not already Utc
我正在使用Jon Skeet在c#fx 3.5中的特定时区创建日期时发布的DateTimeWithZone结构
这不适用于我的情况,因为它假定在构造函数中传递的DateTime是本地时间,因此使用指定的TimeZone将其转换为Utc。
在我的情况下,我们将主要传递已经在Utc中的DateTime对象(因为这是我们正在存储的),所以我们只需要在源DateTime.Kind不是Utc时执行转换。
因此我将构造函数更改为:
1 2 3 4 5 | public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone, DateTimeKind kind = DateTimeKind.Utc) { dateTime = DateTime.SpecifyKind(dateTime, kind); utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone); this.timeZone = timeZone; } |
这里我们有一个可选的Kind参数,默认为Utc。
但是,运行此代码并传递Utc DateTime会生成以下异常:
The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly. For example, when the Kind property is DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local.
根据文档(http://msdn.microsoft.com/en-us/library/bb495915.aspx):
If the Kind property of the dateTime parameter equals DateTimeKind.Utc and the sourceTimeZone parameter equals TimeZoneInfo.Utc, this method returns dateTime without performing any conversion.
由于输入时间和时区都具有Utc的Kind属性,因此我不希望得到此异常。
我误解了吗?
就像MSDN文档所说的那样,如果传入
此外,由于您传入的dateTime将附加一个DateTime,您可能不需要传递单独的Kind参数。
来自文档
Converts the time in a specified time
zone to Coordinated Universal Time
(UTC).
意味着它从提供给Utc的时区转换
如果出现以下情况,函数会引发参数异常
dateTime .Kind is DateTimeKind.Utc and
sourceTimeZone does not equal
TimeZoneInfo.Utc.-or-
dateTime .Kind is DateTimeKind.Local
and sourceTimeZone does not equal
TimeZoneInfo.Local.-or-
sourceTimeZone .IsInvalidDateTime(
dateTime ) returns true.