MSDN, "s" ve "o" biçimlerinin standardı yansıttığını söylese de, bunların yalnızca sınırlı bir alt kümesini ayrıştırabildikleri görülmektedir. Özellikle dizenin saat dilimi belirtimi içermesi bir sorundur. (Temel ISO8601 formatları ya da azaltılmış hassasiyet formatları için de geçerli değildir - ancak bu tam olarak sizin durumunuz değildir.) Bu yüzden, ISO8601 ayrıştırması söz konusu olduğunda özel format dizgelerinden yararlanıyorum. Şu anda tercih ettiğim pasaj:
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 );
}
TZ'siz dizeleri ayrıştırmaktan çekinmiyorsanız (ben yaparım), kapsanan biçim değişikliklerinin sayısını büyük ölçüde artırmak için bir "s" satırı ekleyebilirsiniz.