2011-05-13 44 views
11

Quiero usar joda para analizar las cadenas de fecha y hora en los correos electrónicos. Por desgracia consigo todo tipo de formatos diferentes, por ejemplonecesita conversión flexible de fecha y hora con joda

Wed, 19 Jan 2011 12:52:31 -0600 
Wed, 19 Jan 2011 10:15:34 -0800 (PST) 
Wed, 19 Jan 2011 20:03:48 +0000 (UTC) 
Wed, 19 Jan 2011 17:02:08 -0600 (CST) 
Fri, 21 Jan 2011 10:39:55 +0100 (CET) 
Fri, 21 Jan 2011 17:50:42 -0500 (EST) 
Wed, 06 Apr 2011 15:38:25 GMT 
Thu, 7 Apr 2011 11:38:24 +0200 
Fri, 8 Apr 2011 05:13:36 -0700 (MST) 
20 Apr 2011 03:00:46 -0400 

El código de abajo atrapa la mayor parte de las variantes, pero no todos (por ejemplo, cuando hay dos espacios en lugar de uno, cuando la coma no se encuentra, etc.) . Y parece incómodo.

¿Hay una forma más elegante de manejar esto? Por favor avise.

  DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CET)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CST)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CEST)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(GMT)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(MST)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(PST)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(UTC)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EST)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EDT)'").getParser(), 
        DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CDT)'").getParser(), 
      }; 
      DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter(); 

      try { 
       calendar = inputFormatter.withLocale(Locale.US).parseDateTime(date[0]); 
      } 
      catch(Exception e) { 
       System.out.println("problem with " + date[0]); 
      } 

Respuesta

8

Fuera de la utilización de Joda de DateTimeParser a sí mismo y, esencialmente, al analizar el texto mismo la construcción de un DateTime válido (que creo que sería mucho trabajo), no creo que no hay realmente mucho mal con su enfoque. Aunque creo que tienes demasiados formatos. Creo que su conjunto de formatos podría reducirse a:

DateTimeParser[] parsers = { 
    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(), 
    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '('z')'").getParser(), 
    DateTimeFormat.forPattern("E, d MMM y HH:mm:ss z").getParser(), 
    DateTimeFormat.forPattern("dd MMM y HH:mm:ss Z").getParser(), 
}; 

Z (Capital-Z) es la zona horaria RFC 822 numérico y de pequeña z es el acrónimo de la zona horaria, como PDT, por ejemplo. Esto sigue siendo (en promedio) 2 excepciones arrojadas por solicitud de análisis, pero si esto no necesita ser de alto rendimiento, probablemente no sea tan malo.

+0

La miniconeta z no se analizará en Joda-Time, ya que las tres abreviaturas de las letras son ambiguas – JodaStephen

5

La única forma "más elegante" de manejar esto es escribir su propia implementación de DateTimeParser. Utilizando DateTimeFormatterBuilder puede unir partes que sí funcionan (día/mes/análisis de zona) con partes que no funcionan (analizar uno o más espacios, analizar una abreviatura de zona horaria opcional entre paréntesis), escribir un nuevo analizador solo para esos bits que necesito un formato especial.

Cuestiones relacionadas