2013-07-25 41 views
9

Tôi có một ISO 8601 dấu thời gian trong định dạng:Parsing ISO 8601 với múi giờ để NET datetime

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

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

Ví dụ:

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

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

Làm thế nào tôi có thể phân tích nó để một .NET Framework DateTime với đúng TimeZone được cung cấp?

DateTime.TryParse không hoạt động vì thông tin sau về số TimeZone.

+0

thể trùng lặp của [DateTime.ParseExact , Bỏ qua múi giờ] (http://stackoverflow.com/questions/6676856/datetime-parseexact-ignore-the-timezone) – V4Vendetta

Trả lời

11

Bạn sẽ có thể định dạng nó bằng cách sử dụng DateTimeOffsetK custom format specifier. Sau đó, bạn có thể chuyển đổi số đó thành DateTime sau đó nếu muốn. Mã mẫu:

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); 
    } 
} 

Một điều cần lưu ý là tên này được đặt tên không đúng - đây không phải là múi giờ, chỉ là chênh lệch UTC. Nó không thực sự cho bạn biết múi giờ ban đầu. (Có thể có các múi giờ khác nhau quan sát cùng bù đắp cùng một lúc.)

Hoặc với Noda Time (phiên bản không ổn định, mà sẽ trở thành 1.2 khá sớm):

string text = "2013-07-03T02:16:03.000+01:00"; 
OffsetDateTimePattern pattern = OffsetDateTimePattern.ExtendedIsoPattern; 
OffsetDateTime odt = pattern.Parse(text).Value; 
Console.WriteLine(odt); 
Các vấn đề liên quan