我正在使用Jon Skeet在创建一个特定时区的DateTime(c# fx 3.5)中发布的DateTimeWithZone结构。
对于我的情况,这并没有完全起作用,因为它假设传递给构造函数的DateTime是本地时间,因此会使用指定的时区将其转换为UTC。
在我的情况下,我们主要将传递已经处于UTC的DateTime对象(因为这是我们所存储的),因此我们只需要在源DateTime.Kind不是Utc时执行转换。
因此,我将构造函数更改为:
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 会生成以下异常:
不能完成转换,因为提供的 DateTime 没有正确设置 Kind 属性。例如,当 Kind 属性为 DateTimeKind.Local 时,源时区必须为 TimeZoneInfo.Local。
根据文档 (http://msdn.microsoft.com/en-us/library/bb495915.aspx):
如果 dateTime 参数的 Kind 属性等于 DateTimeKind.Utc 并且 sourceTimeZone 参数等于 TimeZoneInfo.Utc,则此方法返回 dateTime 而不执行任何转换。
由于输入时间和时区都具有 Utc 的 Kind 属性,因此我不希望得到此异常。
我是否理解错了?
TimeZoneInfo.Local
)都具有DateTimeKind.Utc
的类型,因此不应该产生异常。 - Ben FosterConvertTimeToUtc
将从指定时区转换为UTC。如果时区是本地时区,则传递的DateTime
必须是DateTimeKind.Local
。 - Yaur