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 mejor forma de extraer una zona horaria desde un encabezado de fecha de correo en Java?
Respuesta
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.
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.
** ¡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. –
@ 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. –
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. –
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.
Quiero detectar la zona horaria del usuario que envió el correo electrónico. ¿Por qué esto no funcionaría? – mmartijn
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
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).
Puede usar el analizador Mime4J DateTime en lugar del amigable scoped (irónico) MailDateParser. Ver mi respuesta –
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.
- 1. Fecha de PostgreSQL() con la zona horaria
- 2. Determinar la zona horaria de un usuario
- 3. Java GregorianCalendar Zona horaria
- 4. Fecha de análisis con la zona horaria de un correo electrónico?
- 5. Cómo convertir el tiempo de fecha de una zona horaria a otra zona horaria
- 6. java incorrecta zona horaria
- 7. Especifique la zona horaria de la fecha log4j
- 8. ¿Obtener la fecha actual, dada una zona horaria en PHP?
- 9. ajustar la zona horaria
- 10. Cómo ignorar la zona horaria del usuario y forzar la fecha() utiliza la zona horaria específica
- 11. Cómo obtener el patrón de fecha de la zona horaria de la configuración regional en Java
- 12. Python - fecha y hora de una zona horaria específica
- 13. Analiza una fecha con la zona horaria "Etc/GMT"
- 14. Búsqueda de zona horaria desde la latitud longitud
- 15. Cambiar la zona horaria en un proyecto de Django existente
- 16. conversión de cadena hasta la fecha con zona horaria
- 17. Cadena de fecha/hora UTC a la zona horaria
- 18. Firefox new Fecha() desde la cadena construye la hora en la zona horaria local
- 19. Defaulting zona horaria fecha de UTC para DateTime de JodaTime
- 20. NSDatePicker rareza de zona horaria
- 21. DateTime.ParseExact, haga caso de la zona horaria
- 22. ¿Cómo se muestra una fecha con una zona horaria personalizada?
- 23. Java: zona horaria por la que la zona horaria diferente da el mismo valor en milisec
- 24. ¿Qué zona horaria muestra Date.toString()?
- 25. Antes de escribir una fecha de Java en una columna SQL TIMESTAMP, ¿JDBC traduce la fecha de la zona horaria de la JVM a la zona horaria de la sesión de la base de datos?
- 26. Obtener la fecha y hora de la zona horaria del dispositivo iPhone actual desde la aplicación UTC-5 de la zona horaria y la aplicación iPhone?
- 27. Ajustes de zona horaria de fecha y hora
- 28. ¿Cómo averiguar la zona horaria de la fecha y hora específica en una ubicación específica?
- 29. Cambiar la zona horaria sin cambiar el tiempo en Java
- 30. Mostrar la hora/fecha en la zona horaria específica utilizando la función de fecha()
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