转换成正确的日期时间
问题描述:
我在这个日期有问题(从“Jira”REST API结果 - > Worklog-> Started字段),它返回不同的结果形式,我期望的。转换成正确的日期时间
问题:
- 什么样/类型的日期格式是这样吗?
- 为什么返回不同的结果。 字符串日期:2017-06-20T22:09:00.000-0400 C#DateTime.Parse结果:{2017年6月21日上午10时09分00秒}
能否请您提供转换的正确方法这到了正确的时间?
答
它是一种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。
这是绝对有效和预期的行为。
答
时间和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);
}
我会写定制的解析器,因为格式不标准。 –
@MichałTurczyn它是一个ISO。如果ISO不是标准的,那么没有标准:) –