Aunque MSDN dice que los formatos "s" y "o" reflejan el estándar, parecen ser capaces de analizar solo un subconjunto limitado del mismo. Especialmente es un problema si la cadena contiene la especificación de zona horaria. (Tampoco lo hace para formatos básicos ISO8601 o formatos de precisión reducida; sin embargo, este no es exactamente su caso). Es por eso que utilizo cadenas de formato personalizadas cuando se trata de analizar ISO8601. Actualmente mi fragmento preferido es:
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 no le importa analizar cadenas sin TZ (sí), puede agregar una línea "s" para ampliar en gran medida la cantidad de alteraciones de formato cubiertas.