2013-07-25 158 views
9

我在格式ISO 8601時間戳:解析ISO 8601與時區到.NET日期時間

YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] 

YYYY-MM-DDThh:mm:ss[{+|-}hh:mm] 

例子:

2013-07-03T02:16:03.000+01:00 

2013-07-03T02:16:03+01:00 

我怎樣才能解析它到一個.NET Framework DateTime有正確的供應TimeZone

DateTime.TryParse不起作用,因爲關於TimeZone的追蹤信息。

+0

可能重複[DateTime.ParseExact ,忽略時區](http://stackoverflow.com/questions/6676856/datetime-parseexact-ignore-the-timezone) – V4Vendetta

回答

11

您應該可以使用DateTimeOffsetK custom format specifier來格式化它。如果您願意,可以在之後將其轉換爲DateTime。示例代碼:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     string text = "2013-07-03T02:16:03.000+01:00"; 
     string pattern = "yyyy-MM-dd'T'HH:mm:ss.FFFK"; 
     DateTimeOffset dto = DateTimeOffset.ParseExact 
      (text, pattern, CultureInfo.InvariantCulture); 
     Console.WriteLine(dto); 
    } 
} 

有一點要注意的是,這是嚴重命名 - 它實際上不是一個時間段,它只是一個UTC偏移。它不是實際上告訴你原來的時區。 (可以有多個不同的時區觀察同在同一時間偏移。)

或用Noda Time(不穩定的版本,這將很快成爲1.2):的

string text = "2013-07-03T02:16:03.000+01:00"; 
OffsetDateTimePattern pattern = OffsetDateTimePattern.ExtendedIsoPattern; 
OffsetDateTime odt = pattern.Parse(text).Value; 
Console.WriteLine(odt);