关于c#:只有当Utc还没有时才将DateTime转换为Utc

Convert DateTime to Utc only if not already Utc

我正在使用Jon Skeet在c#fx 3.5中的特定时区创建日期时发布的DateTimeWithZone结构

这不适用于我的情况,因为它假定在构造函数中传递的DateTime是本地时间,因此使用指定的TimeZone将其转换为Utc。

在我的情况下,我们将主要传递已经在Utc中的DateTime对象(因为这是我们正在存储的),所以我们只需要在源DateTime.Kind不是Utc时执行转换。

因此我将构造函数更改为:

1
2
3
4
5
    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会生成以下异常:

The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly. For example, when the Kind property is DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local.

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

If the Kind property of the dateTime parameter equals DateTimeKind.Utc and the sourceTimeZone parameter equals TimeZoneInfo.Utc, this method returns dateTime without performing any conversion.

由于输入时间和时区都具有Utc的Kind属性,因此我不希望得到此异常。

我误解了吗?


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

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

来自文档

Converts the time in a specified time
zone to Coordinated Universal Time
(UTC).

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

如果出现以下情况,函数会引发参数异常

dateTime .Kind is DateTimeKind.Utc and
sourceTimeZone does not equal
TimeZoneInfo.Utc.

-or-

dateTime .Kind is DateTimeKind.Local
and sourceTimeZone does not equal
TimeZoneInfo.Local.

-or-

sourceTimeZone .IsInvalidDateTime(
dateTime ) returns true.