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

时间:2011-05-27 10:17:30

标签: c# .net datetime

我正在使用Jon Skeet在Creating a DateTime in a specific Time Zone in 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;
    }

这里我们有一个可选的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属性,因此我不希望得到此异常。

我误解了吗?

1 个答案:

答案 0 :(得分:12)

与MSDN文档一样,如果您传递的DateTime类型设置为DateTimeKind.Utc之外的任何内容,并指定除了Utc之外的TimeZone,则转换函数将引发异常。那一定是这里发生的事情。在您的代码中,您应该检查DateTime是否已经在Utc中,如果是,则跳过转换。

此外,由于您传入的dateTime将附加一个DateTime,您可能不需要传递单独的Kind参数。

来自docs

  

在指定时间内转换时间   区域到协调世界时   (UTC)。

意味着它从提供的时区转换为Utc

如果出现以下情况,函数会抛出一个参数异常:

  

dateTime .Kind是DateTimeKind.Utc和   sourceTimeZone不相等   TimeZoneInfo.Utc

     

-OR -

     

dateTime .Kind是DateTimeKind.Local   和sourceTimeZone不相等   TimeZoneInfo.Local。

     

-OR -

     

sourceTimeZone .IsInvalidDateTime(   dateTime)返回true。