Bien que MSDN dise que les formats «s» et «o» reflètent la norme, ils semblent pouvoir en analyser seulement un sous-ensemble limité. En particulier, cela pose un problème si la chaîne contient une spécification de fuseau horaire. (Ni pour les formats de base ISO8601, ni pour les formats à précision réduite - mais ce n'est pas exactement votre cas.) C'est pourquoi j'utilise des chaînes de format personnalisées lorsqu'il s'agit d'analyser ISO8601. Actuellement, mon extrait préféré est:
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 );
}
Si cela ne vous dérange pas d'analyser les chaînes sans TZ (je le fais), vous pouvez ajouter une ligne «s» pour étendre considérablement le nombre de modifications de format couvertes.