Sebbene MSDN affermi che i formati "s" e "o" riflettono lo standard, sembrano essere in grado di analizzarne solo un sottoinsieme limitato. Soprattutto è un problema se la stringa contiene la specifica del fuso orario. (Né per i formati ISO8601 di base, né per i formati di precisione ridotta, tuttavia non è esattamente questo il caso.) Ecco perché utilizzo analisi di stringhe di formato personalizzate per analizzare ISO8601. Attualmente il mio frammento preferito è:
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 );
}
Se non ti dispiace analizzare le stringhe senza TZ (lo so), puoi aggiungere una linea "s" per estendere notevolmente il numero di alterazioni del formato coperto.