首页 > 解决方案 > DateTime.TryParseExact 的结果有 DateTimeKind.Unspecified 尽管输入的日期时间字符串包含时区信息

问题描述

string dateTimeStr = "2020-01-02T04:00:00Z";
string[] formats = { "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ss.fff'Z'" };

if (DateTime.TryParseExact(dateTimeStr, formats,
                        null,
                        DateTimeStyles.None,
                        out DateTime dateValue))
{
    Console.WriteLine(dateValue.Kind); // why set to DateTimeKind.Unspecified here?
}
else
{
    Console.WriteLine(dateValue);
}

通过此文档

如果s包含时区信息,则根据需要将时间转换为本地时间,并将Kind返回DateTime对象的属性设置为DateTimeKind.Local

但是,在注释行中,尽管 'Z' 中的尾部将其时区指定为 Utc ,但dateValue'Kind字段设置为 。DateTimeKind.UnspecifieddateTimeStr

我不知道它是怎么发生的,我的目标是让输出DateTime设置KindDateTimeKind.Utc. 我怎么能做到这一点?

标签: c#.netdatetime

解决方案


'Z'只是一个转义的字面字母 Z,没有任何意义(对于'T')。格式字符串中的时区说明符K.

string[] formats = { "yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.fffK" };

这将为您提供DateTimeKind.Local记录,然后您调用.ToUniversalTime()结果以获取 UTC。


推荐阅读