Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据输入字符串中提供的时区分析日期时间_C#_Datetime_Utc - Fatal编程技术网

C# 根据输入字符串中提供的时区分析日期时间

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

我试图理解用时区信息解析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 = 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-20T13:00:00+04:00
    2019-05-20T09:00:00Z=
    2019-05-20T05:00:00-04:00
从您的预期结果来看,我相信您希望
13:00:00
在所有三种情况下都是UTC值,但事实并非如此

还有几件事:

  • 传递区域性的
    null
    与传递
    CultureInfo.CurrentCulture
    相同。对于ISO 8601时间戳,最好传递
    CultureInfo.InvariantCulture
    ,因为当当前区域性使用非公历系统时,它既可以提高性能,又可以防止错误

  • 解析到
    日期时间时
    ,如果输入字符串中存在任何偏移量,则结果将调整为本地时区。转换时将考虑原始偏移量,但不会保留原始偏移量。因此,在许多情况下,最好使用
    DateTimeOffset
    类型


您的机器的时区是什么?您使用什么来查看这些值?(考虑添加<代码> WrreLead(ZONETDIME2. ToString(??))以您使用的任何格式,从“o”开始是个好主意。您的结果似乎与您在4时区一致。我想那是东部时间。谢谢@Matt,(+04:00或-04:00)显示时区和日期时间。Parse将其转换回本地时间。它显示特定时间点的UTC偏移量,从世界某处的某个时区。它可能来自本地时区,也可能来自其他时区。此外,偏移量并不是唯一标识时区的,对于同一时区,它也不会总是相同的数字。请参见中的“时区!=偏移”。但是是的,
DateTime.Parse
将看到偏移量,并假设您想要一个本地时间结果。