C# 根据输入字符串中提供的时区分析日期时间
我试图理解用时区信息解析utc时间,但我的代码给了我奇怪的结果,或者至少我不理解C# 根据输入字符串中提供的时区分析日期时间,c#,datetime,utc,C#,Datetime,Utc,我试图理解用时区信息解析utc时间,但我的代码给了我奇怪的结果,或者至少我不理解 var utcTime = DateTime.Parse("2019-05-20T13:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind); // utcTime = {5/20/2019 1:00:00 PM} (its kind is Utc and this is accepted) var zonedTime1 = DateT
var utcTime = DateTime.Parse("2019-05-20T13:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
// utcTime = {5/20/2019 1:00:00 PM} (its kind is Utc and this is accepted)
var zonedTime1 = DateTime.Parse("2019-05-20T13:00:00-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime1 = {5/20/2019 1:00:00 PM} (its kind is Local, but I was expecting {5/20/2019 9:00:00 AM} with Local kind)
var zonedTime2 = DateTime.Parse("2019-05-20T13:00:00+04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime2 = {5/20/2019 5:00:00 AM} (its kind is Local, but I was expecting {5/20/2019 5:00:00 PM} with Local kind)
我想知道我错在哪里,或者我的期望错在哪里。如果utcTime被正确解析,那么为什么zonedTime1和zonedTime2不正确?ISO 8601时间戳中的偏移量描述了与UTC的偏移量,该偏移量已经在本地时间部分进行了调整。因此:
=2019-05-20T13:00:00-04:00
=2019-05-20T17:00:00Z
2019-05-20T13:00:00-04:00
2019-05-20T09:00:00Z=2019-05-20T13:00:00+04:00
2019-05-20T05:00:00-04:00
13:00:00
在所有三种情况下都是UTC值,但事实并非如此
还有几件事:
- 传递区域性的
与传递null
相同。对于ISO 8601时间戳,最好传递CultureInfo.CurrentCulture
,因为当当前区域性使用非公历系统时,它既可以提高性能,又可以防止错误CultureInfo.InvariantCulture
- 解析到
,如果输入字符串中存在任何偏移量,则结果将调整为本地时区。转换时将考虑原始偏移量,但不会保留原始偏移量。因此,在许多情况下,最好使用日期时间时
类型DateTimeOffset
DateTime.Parse
将看到偏移量,并假设您想要一个本地时间结果。