转换为正确的DateTime

时间:2017-06-23 05:22:52

标签: c# datetime datetime-format

我对此日期有疑问(来自" Jira" REST API结果 - > Worklog->已启动字段),它会返回我预期的不同结果。

问题:

  1. 这是什么类型的日期格式?
  2. 为什么返回不同的结果。 字符串日期:2017-06-20T22:09:00.000-0400 C#DateTime.Parse结果:{6/21/2017 10:09:00 AM}
  3. 您能否提供正确的方法将其转换为正确的时间?

2 个答案:

答案 0 :(得分:2)

它是一种ISO格式 - 最优选和不明确的日期格式,代表特定时区的一个时刻。

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

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

您在代码中获得其他价值的原因是因为您位于格林威治标准时间+8,当地时间是6月21日上午10:09,格林威治标准时间-4月6月20日晚上22:09。
这是绝对有效和预期的行为。

答案 1 :(得分:0)

时间和GMT抵消经常导致混乱。

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

在第一种情况下,诚实的答案是没有更多的背景可以告诉你。在第二种情况下,更多的是人们误解GMT补偿 - 许多人认为" GMT ==伦敦"所以" GMT + 2 ==伦敦+ 2" - 当然不正确," GMT ==伦敦冬天; BST(GMT + 1)==伦敦夏季"。所以" GMT + 2"是" GMT + 2",即夏天的柏林或冬天的尼科西亚。

由于这些原因,许多情况下,时间很重要,使用GMT或其他时区,但明确说明偏移,例如" 3:15 am,EDT"。

要回答您的问题,您有几个选择

  • 在你正在做的事情中留出时区;可能会将其改为GMT以使事情变得更容易 - 然后你会做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);
}