2010-01-04 17 views
7

Sto riscontrando un problema in cui una stringa temporale specifica, contenuta nel feed Atom Gmail, non sta analizzando utilizzando DateTime.Parse(). Capisco che potrei usare DateTime.TryParse(), ma sono curioso di sapere perché questi due non funzionano, come fanno tutti gli altri.Problema DateTime.Parse, non supportato in System.Globalization.GregorianCalendar

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

l'eccezione specifica è:

System.FormatException: Il DateTime rappresentato dalla stringa non è supportata in System.Globalization.GregorianCalendar calendario.

Il mio sospetto è che sia a causa dell'ora 24 ... anziché di 00, ma non sono sicuro di come lo correggerei.

+0

Qualcuno ha idea se il feed at v0.3 di gmail (https://mail.google.com/mail/feed/atom) stia ancora restituendo questi timestamp errati a questa data? –

risposta

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

Nice mashup;) +1 –

+0

Oh diamine! +1 –

+0

fantastico. Grazie mille :) –

1

risulta google utilizzando lo standard di data e ora w3c: http://www.w3.org/TR/NOTE-datetime, che C# non supporta? strano, ma non così strano.

questo progetto sembra implementarlo per te.

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

edit: sì, vedo ora che Google non è facendo bene, ma c'è un'eccezione per che nel w3cdate C# struttura.

+0

Tuttavia, tale specifica dichiara "hh = due cifre di ora (da 00 a 23) (am/pm NON consentito)". –

+0

Tuttavia non stanno diventando corretti. Come il documento collegato dice che un'ora di 24 non è consentita. "hh = due cifre di ora (da 00 a 23) (am/pm NON consentito)" –

+0

Il '24' nelle specifiche w3 che hai collegato non è consentito ' "hh = due cifre di ora (da 00 a 23) (am/pm NOT allowed) "' C# Sostiene tale standard, ma Google sta usando un altro standard o variante.Il progetto che hai collegato, però, ne tiene conto. –

2

se è solo l'24 invece di 00, si può semplicemente sostituire e aggiungere un giorno:

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

In questo modo è anche necessario aggiungerne uno al giorno, probabilmente dopo il passaggio. –

+0

@ Martin: hai ragione, modificato. –

1

The DateTime entry in MSDN dice che essa supporta ISO 8601 che permette sia 24 e 00. Si dovrebbe permettere il formato di digitare [YYYY][MM][DD]T[hh][mm]Z es. 2010-01-04T14:04Z.

mezzanotte è un caso particolare e possono essere denominato sia "00:00" e "24:00". La notazione "00:00" viene utilizzata all'inizio di un giorno di calendario e è la più utilizzata. Alla fine del giorno utilizzare "24:00". Notare che "2007-04-05T24: 00" è lo stesso istante come "2007-04-06T00: 00" (vedere le seguenti rappresentazioni di data e ora combinate ).

+3

Purtroppo si tratta solo di 00:00 contro 24:00 (aka mezzanotte) afaik, cioè: quel momento esatto. 24:17 è un po 'più tardi e non è valido per quanto posso vedere. –

+2

Penso che consentirà '24: 00' ma non' 24: 01'. –

+0

Sì, hai ragione entrambi. –

1

stessa idea md5sum, ma un modo diverso:

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 
) 

saresti ancora bisogno di controllare se la data è corretta però.

+0

la data restituita è '27/12/2009 6:11:48 PM' ... Presumo che il -6 ore sia dal mio fuso orario, ma è comunque necessario aggiungere un giorno. –