¿La mejor forma de extraer una zona horaria desde un encabezado de fecha de correo en Java?
timezone javamail (5)
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.
Necesito almacenar la zona horaria desde la que se envió un correo electrónico. ¿Cuál es la mejor manera de extraerlo del encabezado ''Fecha'' del correo electrónico (una fecha RFC822)? ¿Y cuál es el formato recomendado para almacenarlo en la base de datos (estoy usando hibernate)?
La zona horaria en el correo electrónico no 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? - ¿Quieres 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.
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 desde 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 un int
(permitiendo que Hibernate lo traduzca a su base de datos).
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ía DateTimeParser .
int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone();
Después de eso, generalmente convierto los tiempos de fecha al DateTime de Joda . No use SimpleDateFormatter ya que no cubrirá todos los casos para RFC822.
A continuación encontrará 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 el único problema es que la Zona horaria que obtendrá siempre será una zona horaria numérica que puede no ser la zona horaria correcta del usuario que envía el correo electrónico (suponiendo que la aplicación de correo envía TZ a los usuarios y no solo UTC).
Por ejemplo, -0400 no es EDT (es decir, America / New_York) porque no tiene en cuenta el horario de verano.
Probablemente el más fácil de analizar con JodaTime ya que es compatible con ISO8601, consulte Análisis y fechamiento de fecha y hora en Java con Joda Time .
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
System.out.println(parser2.parseDateTime(your_date_string));
Los tiempos siempre deben almacenarse en UTC (GMT) con una zona horaria, es decir, después de analizar convertir de la zona horaria a GMT y eliminar el desplazamiento de ahorro de luz diurna y guardar la zona horaria original.
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.