转换为正确的日期时间

Convert to correct DateTime

我对这个日期有疑问(来自 "Jira" REST API 结果 -> 工作日志 -> 开始字段)returns 与我预期的结果不同。

问题:

  1. 这是什么kind/type日期格式?
  2. 为什么返回不同的结果。 字符串 Date:2017-06-20T22:09:00.000-0400 C# DateTime.Parse 结果:{6/21/2017 10:09:00 AM}

能否提供将其转换为正确时间的正确方法?

这是一种 ISO 格式 - 最可取且最明确的日期格式,代表特定时区的某个时刻。

2017-06-20T22:09:00.000-0400 表示 2017 年 6 月 20 日 22:09 下午(格林威治标准时间 -4)。

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

你在代码中得到另一个值的原因是因为你位于格林威治标准时间 +8 并且你的本地时间是 6 月 21 日 10:09 上午,而格林威治标准时间是 6 月 20 日 22:09 下午-4.
这是绝对有效和预期的行为。

时间和格林威治标准时间的偏移量经常导致混淆。

首先,"it's 8:15am here"是什么意思?格林威治标准时间?伦敦?别的地方?其次,"GMT + 2"是什么意思?

在第一种情况下,诚实的答案是没有更多的上下文就无法判断。在第二种情况下,更多的是人们误解了 GMT 偏移量——许多人认为 "GMT == London" 所以 "GMT + 2 == London + 2"——当然这是不正确的,"GMT == London in winter; BST (GMT + 1) == London in summer"。所以 "GMT + 2" 是 "GMT + 2",即像夏天的柏林或冬天的尼科西亚这样的地方。

由于这些原因,许多时间很重要的情况都使用 GMT 或其他时区,但要明确说明时差,例如“美国东部时间凌晨 3:15”。

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

  • 考虑到您正在做的事情的时区;也许将其更改为 GMT 以使事情变得更容易 - 然后你将使用 GMT +/- 而不是 GMT - 4 +/-。
  • 或者,您可以按照与 这个问题相同的思路做一些事情。

像这样

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);
}