2017-06-23 139 views
1

我在這個日期有問題(從「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不是標準的,那麼沒有標準:) –

回答

2

它是一種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

0

時間和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); 
}