Chociaż MSDN mówi, że formaty „s” i „o” odzwierciedlają standard, wydaje się, że są w stanie przeanalizować tylko ograniczony podzbiór. Szczególnie jest to problem, jeśli ciąg zawiera specyfikację strefy czasowej. (Ani dla podstawowych formatów ISO8601, ani dla formatów o zmniejszonej precyzji - jednak nie jest to dokładnie w twoim przypadku). Dlatego używam niestandardowych ciągów formatów, jeśli chodzi o parsowanie ISO8601. Obecnie mój preferowany fragment to:
static readonly string[] formats = {
"yyyyMMddTHHmmsszzz",
"yyyyMMddTHHmmsszz",
"yyyyMMddTHHmmssZ",
"yyyy-MM-ddTHH:mm:sszzz",
"yyyy-MM-ddTHH:mm:sszz",
"yyyy-MM-ddTHH:mm:ssZ",
"yyyyMMddTHHmmzzz",
"yyyyMMddTHHmmzz",
"yyyyMMddTHHmmZ",
"yyyy-MM-ddTHH:mmzzz",
"yyyy-MM-ddTHH:mmzz",
"yyyy-MM-ddTHH:mmZ",
"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 );
}
Jeśli nie masz nic przeciwko analizowaniu ciągów bez TZ (tak robię), możesz dodać wiersz „s”, aby znacznie zwiększyć liczbę objętych zmian formatu.