2010-03-31 14 views
7

Estoy escribiendo una aplicación de lector de RSS y Correo en C# (técnicamente MonoTouch).Robusta biblioteca de analizador de DateTime para .NET

Me he encontrado con el problema de analizar DateTime s. Veo una gran cantidad de variación en la forma en fechas se presentan en la naturaleza y han comenzado a escribir una función como esta:

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; 
} 

Este, bueno, me enferma. Dos puntos. (1) Es una tontería de mi parte pensar que realmente puedo recopilar una lista de formatos que cubra todo lo que hay por ahí. (2) ¡Está mal! Tenga en cuenta que estoy tratando una hora de fecha EST como UTC (ya que .NET parece ajeno a las zonas horarias).

Estoy buscando una biblioteca existente (solo fuente) que se sabe que maneja muchos de estos formatos.

Además, me gustaría seguir usando UTC DateTimes a lo largo de mi código, así que cualquier biblioteca sugerida debería poder producir DateTimes.

¿Hay algo por el estilo como este?

Actualización Parece que no estaba claro en mi solicitud. Estoy buscando una biblioteca que conozca muchas de estas cadenas de formato wild. DateTime.Parse/DateTime.TryParse solo conoce un par de formatos, y ciertamente no entienden los husos horarios (puede ver que ya lo estoy usando). Necesito algo más poderoso que DateTime.Parse/DateTime.TryParse.

Actualización 2 Todo el mundo estaba pensando en el hecho de que estaba usando Parse en lugar de TryParse. He cambiado el código. Pero sigue siendo incorrecto e incompleto.

+1

Eventualmente tiempo Noda pueden proporcionar algunos de esta funcionalidad: http://code.google.com/p/noda-time/ – TrueWill

+0

Puede que quiera ver [datetime-tryparse-all-possible-type-of-dates] (http://stackoverflow.com/questions/2326127/datetime-tryparse-all-possible-type-of- fechas) – nawfal

Respuesta

2

¿Has probado usar DateTime.TryParse? Esa función ya maneja la mayoría de los formatos.

+0

Llamo a Parse (verifique el código). Es la misma diferencia en términos de ** lo que es compatible **. Cada una de las cadenas de formato que proporcioné falla DateTime.Parse. Necesito algo con más conocimiento. –

1

que puede usar:

DateTime.TryParse() 

en lugar de

DateTime.Parse() 

en lugar de un try/catch

+0

Ya lo hago (ver código). Pero Parse aún fallará en los formatos más exóticos. Puedo vivir con las excepciones, lo que quiero es más variedad en los formatos. –

+0

¿De verdad? Sugiero que hagas un TryParse y un TryParseExact en lugar de tu try/catch. – hunter

+0

Parse vs. TryParse. ¡Ellos son lo mismo! Uno arroja una excepción, el otro no. Lo mismo para ParseExact y TryParseExact. Usan la misma base de datos de formato. Así que sí, ayuda a mi punto n. ° 3, pero las excepciones no son mi verdadera preocupación. Necesito un analizador que conozca muchos formatos. –

3

Además de TryParse en DateTime, .Net también proporciona la estructura DateTimeOffset el que las ofertas el acceso al desplazamiento UTC como otra propiedad en la estructura, lo que le permite almacenar información de zona horaria e información de fecha y hora.

+0

Solo intento evitar crear una base de datos de formato por mi cuenta. Ciertamente, alguien debe haber hecho este trabajo ya? Pero gracias por la información, si tengo que escribirla por mi cuenta, esto será útil. –

+0

+1 Joel! ¡Quédate fuera de mis preguntas, no lo hagas! – hunter

0

he desarrollado una biblioteca (NaturalDate) para analizar las fechas, pero podría no ser lo que está buscando, ya que está dirigido a los formularios de entrada humanos, no generadas por ordenador formas. IIRC puede que ni siquiera analice los formularios que mostró arriba. Además, el sitio web está desactivado por el momento (era lo único en ese servidor).

Si tengo algo de tiempo (probablemente, ya que incluso me pagan), intentaré resucitarlo como un proyecto activamente mantenido.

+0

es posible que desee agregarlo aquí [robust-datetime-parser-library-for-net] (http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal

1

Tuve el mismo problema con los feeds rss que incluían fechas con el nombre de las zonas horarias, no el desplazamiento.Pensé en crear mi propio analizador de fecha y hora para esta situación, pero entendí que alguien probablemente ya lo había creado. Después de unas pocas horas de búsqueda me encontré con el siguiente

C#: el análisis de DateTime con la zona horaria
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

Actualmente estoy usando el código de la URL anterior en un proyecto. A pesar de que el proyecto no ha ido a prod, el código parece funcionar.

BarDev

1

Frank, para analizar las zonas de tiempo que desea utilizar o zz zzz.

versiones futuras de MonoTouch también apoyar el nuevo modificador de "K" (que es un alias para zzz)