首页 > 解决方案 > C# DateTimeOffset 到 DateTime 的转换

问题描述

有人可以向我解释为什么以下代码返回 DateTimeKind.Unspecified。我期待 DateTimeKind.Utc:

DateTimeOffset dateTimeOffset  = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc);
DateTimeKind dateTimeKind = dateTimeOffset.DateTime.Kind;

标签: c#.net

解决方案


隐式转换运算符from DateTimetoDateTimeOffset表现为DateTimeOffset构造函数。您可以查看来源以获取详细信息

// Constructs a DateTimeOffset from a DateTime. For Local and Unspecified kinds,
// extracts the local offset. For UTC, creates a UTC instance with a zero offset.
public DateTimeOffset(DateTime dateTime) {
    TimeSpan offset;
    if (dateTime.Kind != DateTimeKind.Utc) {
        // Local and Unspecified are both treated as Local
        offset = TimeZoneInfo.GetLocalUtcOffset(dateTime, TimeZoneInfoOptions.NoThrowOnInvalidTime);
    }
    else {
        offset = new TimeSpan(0);
    }
    m_offsetMinutes = ValidateOffset(offset);
    m_dateTime = ValidateDate(dateTime, offset);
}

ValidateDate()返回Unspecified实物

...
// make sure the Kind is set to Unspecified
//
return new DateTime(utcTicks, DateTimeKind.Unspecified);

这里的重点也在构造函数的备注部分中描述DateTimeOffset

此构造函数的行为取决于参数的 DateTime.Kind 属性的值dateTime

如果值为 ,DateTime.Kind则新实例DateTimeKind.Utc的属性设置为 dateTime,并且该属性设置为零。DateTimeOffset

如果值为DateTime.KindDateTimeKind.LocalDateTimeKind.UnspecifiedDateTime新实例的属性设置为 dateTime,该Offset属性设置为本地系统当前时区的偏移量。

您正在检查输入日期时间并根据它Kind提取值。Offset结果的DateTime属性DateTimeOffsetUnspecified,因为Offset属性已经表示日期偏移量。DateTime的属性DateTimeOffset也是说

DateTime.Kind返回DateTime 对象的属性值为DateTimeKind.Unspecified


推荐阅读