2011-05-27 57 views
10

我使用DateTimeWithZone结构是乔恩斯基特张贴在Creating a DateTime in a specific Time Zone in c# fx 3.5转换日期时间为UTC仅如果尚未UTC

这不正是我的情况,因为它假定在构造函数中传递的日期时间是工作本地时间,因此使用指定的时区将其转换为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; 
    } 

在这里,我们有一个可选的各种参数,默认为UTC。

然而,运行此代码,并传递一个UTC日期时间产生以下异常:

转换无法完成,因为所提供的日期时间没有Kind属性设置正确。例如,当Kind属性为DateTimeKind.Local时,源时区必须为TimeZoneInfo.Local。

根据该文档(http://msdn.microsoft.com/en-us/library/bb495915.aspx):

如果日期时间参数的种类属性等于DateTimeKind.Utc和sourceTimeZone参数等于TimeZoneInfo.Utc,此方法返回日期时间,而不执行任何转换。

既然输入时间和时区都有一个Utc的Kind属性,那么我不希望得到这个异常。

我误解了吗?

+0

是你的OS XP吗? – V4Vendetta 2011-05-27 10:25:28

+0

不,在上面的例子中,它是Windows 7 – 2011-05-27 10:42:26

回答

12

像MSDN文档说,如果你在设置为任何除了DateTimeKind.Utc的那种DateTime传递并指定TimeZone以外UTC的转换功能会抛出异常。那一定是这里发生的事情。在你的代码中,你应该检查DateTime是否已经在Utc中,并且如果是的话就跳过转换。

此外,由于您传递的日期时间将已附加DateTime,您可能不需要传入单独的Kind参数。

docs

的时间转换成在规定时间 区协调世界时 (UTC)。

这意味着它从供给到UTC

功能的时区转换引发参数异常,如果:

的dateTime .Kind是DateTimeKind.Utc和 sourceTimeZone不等于 TimeZoneInfo.Utc。

- 或 -

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

- 或 -

sourceTimeZone .IsInvalidDateTime( DATETIME)返回true。

+0

,输入日期,目标时区和本地时区('TimeZoneInfo.Local')都有一种DateTimeKind.Utc,所以它不应该产生异常。 – 2011-05-27 12:10:00

+0

@Ben是的,它应该。 'ConvertTimeToUtc'将**从指定的时区转换为utc。如果时区是当地时区,那么您传入的日期时间必须为“DateTimeKind.Local” – Yaur 2011-05-27 12:22:17

+0

您可以在文档中指出我的意思吗? – 2011-05-27 13:44:12