Хоча MSDN каже, що формати "s" та "o" відображають стандарт, вони, здається, можуть розбирати лише обмежений його підмножина. Особливо це проблема, якщо рядок містить специфікацію часового поясу. (Ні для базових форматів ISO8601, ні для форматів зниженої точності. Однак це не зовсім ваш випадок.) Тому я використовую рядки власного формату, коли мова йде про розбір ISO8601. Наразі мій кращий фрагмент:
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 (я це роблю), ви можете додати рядок "s", щоб значно збільшити кількість змін формату, що охоплюється.