Obwohl MSDN sagt, dass die Formate "s" und "o" den Standard widerspiegeln, scheinen sie nur eine begrenzte Teilmenge davon analysieren zu können. Insbesondere ist es ein Problem, wenn die Zeichenfolge eine Zeitzonenspezifikation enthält. (Weder für grundlegende ISO8601-Formate noch für Formate mit reduzierter Genauigkeit - dies ist jedoch nicht genau Ihr Fall.) Aus diesem Grund verwende ich beim Parsen von ISO8601 benutzerdefinierte Formatzeichenfolgen. Derzeit ist mein bevorzugter Ausschnitt:
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 );
}
Wenn es Ihnen nichts ausmacht, TZ-freie Zeichenfolgen zu analysieren (ich auch), können Sie eine "s" -Zeile hinzufügen, um die Anzahl der abgedeckten Formatänderungen erheblich zu erhöhen.