我正在使用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属性,因此我不希望得到此异常。
我误解了吗?
答案 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。