2010-01-04 26 views
7

Tengo un problema por el cual una cadena de tiempo específica, contenida en el feed de Gmail Atom, no se analiza usando DateTime.Parse(). Entiendo que podría usar DateTime.TryParse(), pero tengo curiosidad por saber por qué estos dos no funcionan, como lo hacen todos los demás.Problema DateTime.Parse, no es compatible en System.Globalization.GregorianCalendar

2009-12-28T24:11:48Z 
2009-12-30T24:16:20Z 

la excepción específica es:

System.FormatException: El DateTime representado por la cadena no se admite en System.Globalization.GregorianCalendar calendario.

Mi sospecha es que es por la hora 24 ... en lugar de 00, pero no estoy seguro de cómo lo rectificaría.

+0

Alguien tiene alguna idea de si el feed de gmail atom v0.3 (https://mail.google.com/mail/feed/atom) todavía está devolviendo estas marcas de tiempo incorrectas a esta fecha? –

Respuesta

16
private static DateTime ParseDate(string s) 
{ 
    DateTime result; 
    if (!DateTime.TryParse(s, out result)) 
    {     
     result = DateTime.ParseExact(s, "yyyy-MM-ddT24:mm:ssK", System.Globalization.CultureInfo.InvariantCulture); 
     result = result.AddDays(1); 
    } 
    return result; 
} 
+0

Bonito mashup;) +1 –

+0

¡Oh, diablos! +1 –

+0

fantástico. Muchas gracias :) –

1

resulta de google utilizando el estándar de fecha y hora w3c: http://www.w3.org/TR/NOTE-datetime, que C# no es compatible? extraño, pero no tan raro.

este proyecto parece implementarlo para usted.

http://www.codeproject.com/KB/cs/w3cdate.aspx

edición: sí, veo ahora que Google de no hacer las cosas bien, pero hay una excepción para que en el # estructura w3cdate c.

+0

Sin embargo, esa especificación declara "hh = dos dígitos de la hora (de 00 a 23) (no se permite am/pm)". –

+0

Aunque no están siendo correctos. Como el documento vinculado dice que una hora de 24 no está permitida. "hh = dos dígitos de la hora (00 a 23) (am/pm NO permitido)" –

+0

El '24' en la especificación w3 que ha vinculado no está permitido ' "hh = dos dígitos de la hora (00 a 23) (am/pm NO permitido) "' C# ES compatible con ese estándar, pero Google usa otro estándar o variante.Sin embargo, el proyecto que vinculó lo cuenta. –

2

si es sólo el lugar de 2400, sólo tiene que reemplazarlo y añadir un día:

String s = "2009-12-28T24:11:48Z"; 
DateTime dt; 
if (s.Contains("T24:") 
{ 
    s = s.Replace("T24:", "T00:"); 

    if (DateTime.TryParse(s, out dt)) 
     dt.AddDays(1); 
} 
else 
{ 
    DateTime.TryParse(s, out dt); 
} 
+0

Al hacer esto, también necesitaría agregar uno al día probablemente después de aprobar. –

+0

@Martin - Tienes razón, editado. –

1

The DateTime entry in MSDN dice que apoya ISO 8601 que permite tanto 24 y 00. Se debe permitir que el formato de tipo [YYYY][MM][DD]T[hh][mm]Z por ej. 2010-01-04T14:04Z.

de medianoche es un caso especial y puede ser referido como tanto "00:00" y "24:00". La notación "00:00" se usa al comienzo de un día calendario y es la más utilizada. En el final del día , use "24:00". Tenga en cuenta que "2007-04-05T24: 00" es el mismo instante que "2007-04-06T00: 00" (consulte las representaciones de fecha y hora Combinadas a continuación).

+3

Lamentablemente, eso solo habla de 00:00 contra 24:00 (aka medianoche) afaik, es decir: Ese momento exacto. 24:17 es un poco después de eso y no es válido por lo que puedo ver. –

+2

Creo que permitirá '24: 00' pero no' 24: 01'. –

+0

Sí, ambos tienen razón. –

1

La misma idea que md5sum, pero de una manera diferente:

DateTime.ParseExact(
    "2009-12-28T24:11:48Z", 
    new []{ "yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddT24:mm:ssK" }, 
    System.Globalization.CultureInfo.InvariantCulture, 
    System.Globalization.DateTimeStyles.None 
) 

usted todavía tienen que comprobar si la fecha es correcta, aunque.

+0

fecha de devolución es '12/27/2009 6:11:48 PM' ... Supongo que las -6 horas son de mi zona horaria, pero aún necesita agregar un día. –

Cuestiones relacionadas