2012-10-09 49 views
-2

我從Web服務接收下面的日期時間字符串,並嘗試將其轉換爲UTC日期時間對象,但引發異常。將UTC字符串轉換爲DateTime時出現異常

try 
{ 
    string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z"; 
    DateTime TransformedReceivedDateTimeString = DateTime.ParseExact(ReceivedDateTimeString, "o", CultureInfo.InvariantCulture, DateTimeStyles.None); 
} 
catch (Exception e) 
} 

爲什麼拋出異常?字符串的格式或我的轉換有問題嗎?

+0

第2部分是什麼? – Niklas

+0

http://stackoverflow.com/questions/12705874/utc-string-to-datetime-exception - 抱歉不能使用相同的問題標題 – cs0815

+1

恕我直言,downvotes是有點苛刻。這兩個鏈接的問題都沒有給出明確適用於這種情況的答案。 – Joe

回答

1

這個什麼:

DateTime TransformedReceivedDateTimeString = DateTime.Parse(ReceivedDateTimeString).ToUniversalTime(); 
+1

我想你將不得不將它定義爲UTC?所以我沒有看到太多的區別。 – cs0815

+0

你只需要轉換爲UTC –

+0

你的意思是:DateTime.Parse(ReceivedDateTimeString).ToUniversalTime()? – cs0815

1

好吧,你被喬恩斯基特給出的正確答案是最後一次:UTC string to DateTime exception

注意,有7個FS在那裏,但你只是完成有6位小數。

現在是同樣的錯誤。你有三種可能的解決方案:

  1. 當你在你前面的問題(comment)說,你可以有你的數據 提供商發送給您的標準格式的數據。
  2. 如果您沒有訪問數據,你可以在風格參數更改爲自定義格式: "yyyy-MM-ddTHH:mm:ss.ffffffK"
  3. 或者,你可以在末尾添加一位小數點遵循標準格式: "2012-10-09T07:42:13.4091910Z";

變化的標準格式

+1

如果我試圖解析可能來自外部源的輸入,那麼說「改變輸入」並不是很有幫助。 – Joe

+0

謝謝喬。這正是我的觀點! – cs0815

2

試試這個:

string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z"; 
DateTime TransformedReceivedDateTimeString = 
    DateTime.ParseExact(ReceivedDateTimeString, 
         "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFK", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.RoundTripKind); 

documentation for the "o" format specifier指出:

的 「O」 或 「o」 標準​​格式說明對應於「YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' SS'。 'fffffffK'爲DateTime值和「yyyy' - 'MM' - 'dd'T'HH'自定義格式字符串:'mm':'ss'。'fffffffzzz'用於DateTimeOffset值的自定義格式字符串。

I.e. 7位小數,而不是像你的字符串中的6。

格式化的字符串可以由如果風格參數設置爲DateTimeStyles.RoundtripKind使用DateTimeParse(字符串,的IFormatProvider,DateTimeStyles)或DateTimeParseExact方法被解析回來。

I.e.你需要指定DateTimeStyles.RoundtripKind。

在上面,我已經使用「FFF ...」而不是「fff ...」,因爲這將接受可變數量的小數(缺少尾隨小數被視爲零)。這符合「寬容投入,嚴於產出」的原則。

此外,我指定DateTimeStyles.RoundtripKind來解析時保留Kind屬性(在這種情況下Utc)。如果您不這樣做,結果將被轉換爲當地時間。

相關問題