转换成正确的日期时间

转换成正确的日期时间

问题描述:

我在这个日期有问题(从“Jira”REST API结果 - > Worklog-> Started字段),它返回不同的结果形式,我期望的。转换成正确的日期时间

问题:

  1. 什么样/类型的日期格式是这样吗?
  2. 为什么返回不同的结果。 字符串日期:2017-06-20T22:09:00.000-0400 C#DateTime.Parse结果:{2017年6月21日上午10时09分00秒}

能否请您提供转换的正确方法这到了正确的时间?

+0

我会写定制的解析器,因为格式不标准。 –

+2

@MichałTurczyn它是一个ISO。如果ISO不是标准的,那么没有标准:) –

它是一种ISO格式 - 最好的和不含歧义的日期格式,代表特定时区的时间。

2017-06-20T22:09:00.000-0400代表2017年6月20日22:09 PM在时区GMT -4。

ISO格式被包括C#在内的大多数语言正确解析。

您在代码中获得另一个值的原因是因为您位于GMT +8,当地时间是6月21日10:09 AM,当时是格林威治标准时间-6月20日22:09 PM。
这是绝对有效和预期的行为。

+0

最近,我们遇到了一个不被c#解析的例子,因为在ISO 8601中'2017-06-22T24:00:00.000'是一个正确的日期,在这一点上, c#完全丢失并抛出异常。 – Jimbot

+0

@Jimbot 24:00:00?这是闰秒吗? –

+0

不,它在ISO 8601中完全确定,我检查了规范,但没有在c#中...它只是意味着第二天在午夜:1995-02-04 24:00 = 1995-02-05 00:00 – Jimbot

时间和GMT偏移常常导致混淆。

首先,“这里8:15”是什么意思?格林威治标准时间?伦敦?别的地方?其次,“GMT + 2”是什么意思?

在第一种情况下,诚实的答案是没有办法告诉没有更多的上下文。在第二种情况下,更多的是人们误解GMT抵消 - 很多人认为“GMT ==伦敦”,所以“GMT + 2 ==伦敦+2” - 当然这是不正确的,“GMT在伦敦冬季; BST (GMT + 1)==夏天的伦敦“。所以“GMT + 2”是“GMT + 2”,即夏季的柏林或冬季的尼科西亚。

由于这些原因,许多情况下,时间很重要,使用GMT或其他时区,但明确指出偏移量,例如, “美国东部时间上午3:15”。

要回答你的问题,你有几种选择

  • 允许在你正在做的事情的时区;也许把它改成格林威治标准时间让事情变得更容易 - 然后你会做GMT +/-而不是GMT - 4 +/-。
  • 或者,您可以按照与此问题的answer相同的方式进行操作。

像这样的事情

DateTimeOffset date = new DateTimeOffset(2017, 6, 20, 22, 09, 0, 0, TimeSpan.FromHours(-4)); 
// 20 June 2017, 22:09, GMT-4 

public static DateTimeOffset ParseIso8601(string iso8601String) 
{ 
    return DateTimeOffset.ParseExact(
     iso8601String, 
     new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" }, 
     CultureInfo.InvariantCulture, 
     DateTimeStyles.None); 
}