Mặc dù MSDN nói rằng các định dạng "s" và "o" phản ánh tiêu chuẩn, nhưng dường như chúng chỉ có thể phân tích một tập hợp con giới hạn của nó. Đặc biệt nó là một vấn đề nếu chuỗi chứa đặc tả múi giờ. (Không áp dụng cho các định dạng ISO8601 cơ bản hoặc giảm các định dạng chính xác - tuy nhiên đây không phải là trường hợp chính xác của bạn.) Đó là lý do tại sao tôi sử dụng các chuỗi định dạng tùy chỉnh khi phân tích cú pháp ISO8601. Hiện tại đoạn trích ưa thích của tôi là:
static readonly string[] formats = {
// Basic formats
"yyyyMMddTHHmmsszzz",
"yyyyMMddTHHmmsszz",
"yyyyMMddTHHmmssZ",
// Extended formats
"yyyy-MM-ddTHH:mm:sszzz",
"yyyy-MM-ddTHH:mm:sszz",
"yyyy-MM-ddTHH:mm:ssZ",
// All of the above with reduced accuracy
"yyyyMMddTHHmmzzz",
"yyyyMMddTHHmmzz",
"yyyyMMddTHHmmZ",
"yyyy-MM-ddTHH:mmzzz",
"yyyy-MM-ddTHH:mmzz",
"yyyy-MM-ddTHH:mmZ",
// Accuracy reduced to hours
"yyyyMMddTHHzzz",
"yyyyMMddTHHzz",
"yyyyMMddTHHZ",
"yyyy-MM-ddTHHzzz",
"yyyy-MM-ddTHHzz",
"yyyy-MM-ddTHHZ"
};
public static DateTime ParseISO8601String ( string str )
{
return DateTime.ParseExact ( str, formats,
CultureInfo.InvariantCulture, DateTimeStyles.None );
}
Nếu bạn không nhớ phân tích các chuỗi không có TZ (tôi làm), bạn có thể thêm một dòng "s" để mở rộng đáng kể số lượng thay đổi định dạng được bảo hiểm.