仅在尚未使用Utc的情况下才将DateTime转换为Utc

我使用Jon Skeet在c#fx 3.5的特定时区创建DateTime时发布的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属性,因此我不希望得到此异常。

我误解了吗?


像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。

链接地址: http://www.djcxy.com/p/46583.html

上一篇: Convert DateTime to Utc only if not already Utc

下一篇: c# Serialize with JSON.NET inherited private fields