2010-05-12 13 views
7

Tengo una fecha JS que Dojo está convirtiendo en formato RFC822. La llamada de función - dojo.date.toRfc3339 (jsDate), genera la siguiente fecha - 2007-02-26T20: 15: 00 + 02: 00.RFC822 Timezone Parsing en Java

Tengo una aplicación que usa una fecha Java SimpleDateFormat para analizar en las fechas generadas anteriormente. Tengo problemas para analizar este formato de fecha debido a la zona horaria. He intentado utilizar

aaaa-mm-DD'T'hh: mm: ssZ

Esta falla como la 'Z' para la zona horaria no espera un ':' carácter. ¿Alguien sabe cómo iba a especificar un patrón para manejar una fecha RFC822 con el ':'?

revisión:

Gracias para interpretar correctamente lo que yo estoy tratando de hacer :) me quería decir la fecha está generando en RFC3339 y necesitaba RFC822. Parece que tendré que anular el JavaScript. Esperaba que no tuviera que hacer eso y podría especificar un patrón de formato de fecha sin tener que modificar ningún código Java ya que el formato de fecha simplemente se inyecta en un bean de primavera de una aplicación.

Para completar, ¿hay alguna forma de especificar en una expresión de formato de fecha que se ignoren los caracteres en la secuencia (sin realizar manipulación/reemplazo de cadenas)? En este caso, estaría diciendo "ignorar": ¿o simplemente ignorar la zona horaria todos juntos?

Respuesta

1

Quitaría el ':' de la zona horaria y usaría el formato que tiene arriba.

3

Esto funciona

SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-DD'T'hh:mm:ssZ"); 
format.parse("2007-02-26T20:15:00+02:00".replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2")); 

(Tenga en cuenta que he de tomar el colon último out del formato después de la 'Z' especificador de formato.)

2

RFC822 no permite dos puntos para estar en el momento parte de la zona de la fecha. Espera solo los 4 dígitos. El nombre de ese método Dojo indica que está usando RFC3339. Parece que es prácticamente el mismo formato que ISO8601. Ocurre que Joda Time tiene ISODateTimeFormat que es compatible con ISO8601 si puede usar esa biblioteca. El método dateTimeNoMillis() parece una coincidencia con el formato Dojo. Realmente es mejor que la API estándar de fecha y hora de Java. De lo contrario, la sugerencia de altamente cafeína sería el camino a seguir.

actualizadas en respuesta a la actualización de Jamen

no hay una manera de tener Dojo utilizar un formato que no incluye la zona horaria? Luego puede ajustar el formato en el lado de Java para que coincida. No sé mucho sobre Dojo y no he podido encontrar ninguna documentación sobre la función toRfc3339 que proporciona.

4
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateUtil { 

    public static Date ParseRFC3339DateFormat(String p_date) 
    { 
     try{ 
      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
      String dts = p_date.replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2"); 
      return formatter.parse(dts); 
     }catch (Exception e) { 
       return null; 
     } 
    } 
} 
1

En lugar de utilizar dojo.date.toRfc3339 (jsDate) puede crear su propia función con una cadena de formato personalizada.

Algo como lo siguiente eliminaría los dos puntos y debería ser analizable por su formato java.

function toRfc3339String(jsDate){ 
    return dojo.date.locale.format(jsDate,{selector: 'date', datePattern:'yyyy-MM-dd\'T\'hh:mm:ssZ'}); 
} 
0

Usted puede hacer esto de forma genérica y sin Java 7. He pedido 2 preguntas en StackOverflow en esto, dentro de 2012, por lo hay una solución que no necesita ninguna biblioteca de terceros.

Solo compruebe la implementación presentada en la descripción de mi latest question, que también apunta al anterior que trata exactamente este problema.