我想用.NET的DateTime結構解析一個ISO8601格式的日期/時間字符串。用DateTime解析ISO8601日期/時間struct
爲了讓我充分認識到這個問題,我將使用.NET和JavaScript進行測試。我目前在英國(英國夏令時,即UTC + 01:00)。
我ISO8601的理解是:
- 當字符串後綴爲 「Z」,時間是UTC表示。
- 當字符串後綴爲「+/- hh:mm」時,時間用 表示當地時間,其中「+/- hh:mm」表示與UTC的偏移量。
考慮以下ISO8601日期/時間格式字符串:
"1987-01-05T08:45:30.500+0100"
鑑於以上我的觀點,這個字符串表示的「8時45分三十〇秒」本地時間和UTC時間「7點45分三十秒」
當前時區測試(.NET)
DateTime now = DateTime.Now;
Console.WriteLine(now.ToLocalTime()); // 27/08/2013 12:02:43
Console.WriteLine(now.ToUniversalTime()); // 27/08/2013 11:02:43
當前時區測試(JavaScript的)
var now = new Date(Date.now());
now.toString(); // Tue Aug 27 2013 12:03:46 GMT+0100 (GMT Daylight Time)
now.toUTCString(); // Tue, 27 Aug 2013 11:03:46 GMT
從細微
除了(分/秒)的兩個例子之間的差異,他們正在返回正是我所期望的爲英國夏令時間(UTC + 01:00 )。 分/秒的差異是因爲我無法同時運行.NET測試和JavaScript測試。
所以現在讓我用ISO8601的日期/時間格式的字符串:
解析ISO8601格式字符串(.NET)
DateTime dt = DateTime.Parse("1987-01-05T08:45:30.500+0100");
Console.WriteLine(dt.ToLocalTime()); // 05/01/1987 07:45:30
Console.WriteLine(dt.ToUniversalTime()); // 05/01/1987 07:45:30
解析ISO8601格式字符串(JavaScript的)
var dt = new Date("1987-01-05T08:45:30.500+0100");
dt.toString(); // Mon Jan 05 1987 07:45:30 GMT+0000 (GMT Standard Time)
dt.toUTCString(); //Mon, 05 Jan 1987 07:45:30 GMT
這似乎不符合顯示日期/時間「現在」的示例。爲什麼在英國夏令時(UTC + 01:00)顯示「現在」示例時,顯示爲我在英國冬令時(UTC + 00:00)?
如果我更改我的時區設置,我會得到本地/世界時間的預期結果,但是如果它們設置爲我當前的時間/區域,這似乎會給出不一致的結果。
編輯:簡而言之,就好像.NET和JavaScript在我嘗試解析字符串時忽略夏令時/英國夏令時(UTC + 01:00)一樣。結果對冬天來說是正確的,當我改變我的時間/地區時也是正確的。但現在這是不正確的「任何」我在英國測試過的機器。
我認爲'+ 0100'被忽略,它可能取決於本地計算機上的'區域設置'。我測試了代碼,它顯示了我07:45:30'與'02:45:30'不像你的測試。 –
這就是你得到的生活/編碼在UTC時區...解析*總是*返回本地時間,但在你的情況下UTC到本地是沒有操作。 –
實際上你的代碼應該是'Local:05/01/1987 07:45:30'和'UTC:05/01/1987 08:45:30','+ 0100'只是表示時間是UTC,因此所有當地時間都將是UTC時間1。 –