2010-03-31 15 views
7

Sto scrivendo un'app di lettura RSS e Mail in C# (tecnicamente MonoTouch).Robusta libreria parser DateTime per .NET

Ho incontrato il problema di analizzare DateTime s. Vedo un sacco di variabilità nel modo in cui date sono presentate nel selvaggio e hanno cominciato a scrivere una funzione come questa:

static string[] DateTimeFormats = new string[] { 
    "ddd, d MMM yyyy H:mm:ss \"GMT+00:00\"", 
    "d MMM yyyy H:mm:ss \"EST\"", 
    "yyyy-MM-dd\"T\"HH:mm:ss\"Z\"", 
    "ddd MMM d HH:mm:ss \"+0000\" yyyy", 
}; 
public static DateTime ParseTime(string timeStr) { 

    var r = DateTime.MinValue; 

    var styles = DateTimeStyles.AdjustToUniversal | 
       DateTimeStyles.AllowWhiteSpaces; 

    if (DateTime.TryParse(timeStr, 
          CultureInfo.InvariantCulture, 
           styles, 
           out r)) { 
     return r; 
    } 
    else {    
     if (DateTime.TryParseExact(timeStr, 
            DateTimeFormats, 
            CultureInfo.InvariantCulture, 
            styles, 
            out r)) { 
      return r; // BUGGY! Ignores time zone!! 
     } 
    } 

    Console.WriteLine ("BAAAAAAAAAAAAD"); 
    return DateTime.MinValue; 
} 

questo, beh, mi fa star male. Due punti. (1) È sciocco da parte mia pensare di poter effettivamente raccogliere una lista di formati che coprirà tutto là fuori. (2) È sbagliato! Si noti che sto trattando una data EST come UTC (dato che .NET sembra ignaro dei fusi orari).

Sto cercando una libreria esistente (fonte solo per favore) che è noto per gestire un sacco di questi formati.

Inoltre, mi piacerebbe continuare a utilizzare UTC DateTimes attraverso il mio codice, quindi qualsiasi libreria suggerita dovrebbe essere in grado di produrre DateTimes.

C'è qualcosa là fuori in questo modo?

Aggiornamento Sembrerebbe che la richiesta non sia chiara. Sto cercando una libreria che conosca molte di queste stringhe di formato selvaggio. DateTime.Parse/DateTime.TryParse conoscono solo un paio di formati, e certamente non capiscono i fusi orari (si vede che lo sto già usando). Ho bisogno di qualcosa di più potente di DateTime.Parse/DateTime.TryParse.

Aggiornamento 2 Tutti si soffermavano sul fatto che stavo usando Parse al posto di TryParse. Ho cambiato il codice. Ma è ancora sbagliato e incompleto.

+1

Alla fine Noda-tempo possono fornire alcune di queste funzionalità: http://code.google.com/p/noda-time/ – TrueWill

+0

Potrebbe voler vedere [datetime-tryparse-all-possible-type-of-dates] (http://stackoverflow.com/questions/2326127/datetime-tryparse-all-possible-type-of- date) – nawfal

risposta

2

Hai provato a utilizzare solo DateTime.TryParse? Questa funzione gestisce già la maggior parte dei formati.

+0

Io chiamo Parse (controlla il codice). È la stessa differenza in termini di ** ciò che è supportato **. Ogni stringa di formato che ho fornito non funziona DateTime.Parse. Ho bisogno di qualcosa con più conoscenza. –

1

Si potrebbe utilizzare:

DateTime.TryParse() 

invece di

DateTime.Parse() 

piuttosto che un try/catch

+0

Lo faccio già (vedi codice). Ma Parse fallirà ancora per i formati più esotici. Posso vivere con le eccezioni, quello che voglio è più varietà nei formati. –

+0

Davvero? Ti sto suggerendo di fare un TryParse e un TryParseExact piuttosto che il tuo try/catch. – hunter

+0

Parse vs. TryParse. Loro sono la stessa cosa! Uno lancia un'eccezione, l'altro no. Lo stesso per ParseExact e TryParseExact. Usano lo stesso database di formato. Quindi sì, aiuta il mio punto n. 3, ma le eccezioni non sono la mia vera preoccupazione. Ho bisogno di un parser che conosca molti formati. –

3

Oltre a TryParse su DateTime, Net fornisce anche la struct DateTimeOffset che offerte accesso all'offset UTC come un'altra proprietà sulla struct, che consente di memorizzare informazioni sul fuso orario e informazioni datetime insieme.

+0

Sto solo cercando di evitare di creare un database di formati per conto mio. Certamente qualcuno deve aver già fatto questo lavoro? Ma grazie per le informazioni, se devo scriverlo da solo, questo sarà utile. –

+0

+1 Joel! Stai fuori dalle mie domande, sumbitch! – hunter

0

ho sviluppato una libreria (NaturalDate) per l'analisi di date ma potrebbe non essere quello che stai cercando in quanto si rivolge a forme di input umani, non di computer generato forme. IIRC potrebbe non analizzare nemmeno i moduli che hai mostrato sopra. Inoltre, il sito web è inattivo per il momento (era l'unica cosa su quel server).

Se ottengo un po 'di tempo (probabilmente, dato che potrei anche essere pagato per questo), cercherò di resuscitarlo come un progetto mantenuto attivamente.

+0

potresti aggiungerlo qui [robust-datetime-parser-library-for-net] (http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal

1

Ho avuto lo stesso problema con i feed RSS che includevano le date con il nome dei fusi orari, non l'offset.Ho pensato di creare il mio parser DateTime per questa situazione, ma ho creduto che qualcuno lo avesse già creato. Dopo alcune ore di ricerca ho trovato il seguente

C#: Analisi DateTime con TimeZone
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

Attualmente sto usando questo codice dall'URL precedente in un progetto. Anche se il progetto non è andato a prod, il codice sembra funzionare.

BarDev

1

Frank, per analizzare i fusi orari che si desidera utilizzare o zz zzz.

Le versioni future di MonoTouch supporteranno anche il nuovo modificatore "K" (che è un alias per zzz)