我正在使用Jon Skeet 在c#fx 3.5中的特定时区创建日期时发布的DateTimeWithZone结构
这不适用于我的情况,因为它假定在构造函数中传递的DateTime是本地时间,因此使用指定的TimeZone将其转换为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;
}
Run Code Online (Sandbox Code Playgroud)
这里我们有一个可选的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属性,因此我不希望得到此异常.
我误解了吗?
Yau*_*aur 12
像MSDN文档说,如果你在一个通过DateTime与设置为任何除了实物DateTimeKind.Utc,并指定一个TimeZone比UTC其它的转换功能会抛出异常.那一定是这里发生的事情.在您的代码中,您应该检查DateTime是否已经在Utc中,如果是,则跳过转换.
此外,由于您传入的dateTime将附加一个DateTime,您可能不需要传递单独的Kind参数.
来自文档
将指定时区的时间转换为协调世界时(UTC).
意味着它从提供给Utc的时区转换
如果出现以下情况,函数会引发参数异常
dateTime .Kind是DateTimeKind.Utc,sourceTimeZone不等于TimeZoneInfo.Utc.
-要么-
dateTime .Kind是DateTimeKind.Local,sourceTimeZone不等于TimeZoneInfo.Local.
-要么-
sourceTimeZone .IsInvalidDateTime(dateTime)返回true.