仅在Utc尚未转换时才将DateTime转换为Utc

Ben*_*ter 10 .net c# datetime

我正在使用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.