Meskipun MSDN mengatakan bahwa format "s" dan "o" mencerminkan standar, mereka tampaknya hanya dapat menguraikan sebagian saja. Terutama masalah jika string berisi spesifikasi zona waktu. (Baik itu berlaku untuk format ISO8601 dasar, atau format presisi yang diperkecil - namun ini bukan kasus Anda.) Itulah mengapa saya menggunakan string format khusus ketika harus mem-parsing ISO8601. Saat ini cuplikan pilihan saya adalah:
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 );
}
Jika Anda tidak keberatan mem-parsing string TZ-less (saya lakukan), Anda dapat menambahkan baris "s" untuk menambah jumlah perubahan format yang dibahas.