2008-09-20 8 views

Respuesta

0

Extraiga los datos del encabezado utilizando algún tipo de subcadena o expresión regular. Analice la fecha con un SimpleDateFormatter para crear un objeto Date.

+0

Gracias jhawk28. Sin embargo, puedo obtener la fecha usando la clase MailDateFormat. Esa clase también analiza la zona horaria, pero parece que no hay una manera fácil de encontrar esa TimeZone, excepto para copiar el código de MailDateParser. – mmartijn

1

Probablemente el más fácil de analizar con JodaTime ya que es compatible con ISO8601, vea Date and Time Parsing and Formatting in Java with Joda Time.

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis(); 
System.out.println(parser2.parseDateTime(your_date_string)); 

tiempos siempre se deben almacenar en UTC (GMT) con una zona horaria - es decir, después del análisis convertir de la zona horaria a GMT y retire el horario de verano offset y guardar la zona horaria originales.

Debe almacenar la fecha con la zona horaria después de convertir a UTC.

Si elimina o no maneja la zona horaria, causará problemas al tratar con datos que provienen de una zona horaria diferente.

+0

** ¡Incorrecto! ** Es mucho mejor almacenar el DateTime * con * la zona horaria siempre que sea correcto y el uso de una biblioteca de fecha y hora moderna como Joda. Eso es manejar el TimeZone. Al tirar la zona horaria y normalizar a UTC, perderá los datos que podrían ser valiosos para el usuario, especialmente si se trata de una aplicación móvil/global. ** ¡Además, SimpleDateFormat no es seguro para nada! ** ... Estoy tentado a -1. –

+0

@ AdamGent Eso es lo que quise decir con "si elimina o no maneja la zona horaria puede causar problemas ...". Voy a editar para que quede claro como el cristal. –

+0

Quite la publicación del blog también o atl este tenga en cuenta el peligro de concurrencia grave de crear una matriz estática pública de simpledateformat. –

0

La zona horaria en el correo electrónico no se mostrará en qué zona horaria se envió. Algunos programas usan UTC o GMT alguna vez. Por supuesto, la zona horaria es parte del valor del tiempo de la fecha y también debe analizarse.

¿Por qué quieres saberlo? - ¿Desea normalizar la marca de tiempo? Luego use un DateFormat para analizarlo. - ¿Desea detectar el tiempo del usuario que envía el correo electrónico? Esto no funcionará correctamente.

+0

Quiero detectar la zona horaria del usuario que envió el correo electrónico. ¿Por qué esto no funcionaría? – mmartijn

+0

Porque algunos programas envían siempre la hora UTC o GMT independientemente de la zona horaria del usuario. Es la zona horaria de la cadena de fecha formateada y no de la computadora del usuario. – Horcrux7

0

Parece que ya lo mencionaste en uno de tus comentarios, pero creo que es tu mejor respuesta. La biblioteca JavaMail contiene el código de análisis del encabezado de fecha RFC822 en javax.mail.internet.MailDateFormat. Lamentablemente, no expone el análisis TimeZone directamente, por lo que deberá copiar el código necesario directamente en javax.mail.internet.MailDateParser, pero vale la pena aprovechar el trabajo cuidadoso que ya se ha realizado.

En cuanto a su almacenamiento, el analizador le dará la fecha como un desplazamiento, por lo que debería poder almacenarlo bien como int (dejando que Hibernate lo traduzca a su base de datos).

+0

Puede usar el analizador Mime4J DateTime en lugar del amigable scoped (irónico) MailDateParser. Ver mi respuesta –

0

Te recomiendo que uses Mime4J.

La biblioteca está diseñada para analizar todo tipo de basura de correo electrónico. Para las fechas de análisis usarías su DateTimeParser.

int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone(); 

Después de eso, por lo general convertir el datetimes a Joda's DateTime. No use SimpleDateFormatter ya que no cubrirá todos los casos para RFC822.

A continuación obtendrá la Joda TimeZone (desde la zona int de arriba) que es superior a la TZ de Java.

// Stupid hack in case the zone is not in [-+]zzzz format 
final int hours; 
final int minutes; 
if (zone > 24 || zone < -24) { 
    hours = zone/100; 
    minutes = minutes = Math.abs(zone % 100); 
} 
else { 
    hours = zone; 
    minutes = 0; 
} 
DateTimeZone.forOffsetHoursMinutes(hours, minutes); 

Ahora bien, el único problema es que la zona horaria obtendrá siempre será una zona horaria numérico que todavía no puede ser la zona horaria correcta del usuario que envía el correo electrónico (suponiendo que la aplicación de correo electrónico enviado a los usuarios TZ y no solo UTC).

Por ejemplo, -0400 no es EDT (es decir, America/New_York) porque no tiene en cuenta el horario de verano.

Cuestiones relacionadas