Pregunta

Tengo una cadena de un encabezado de correo electrónico, como Fecha: lunes, 27 de octubre de 2008 08:33:29 -0700 . Lo que necesito es una instancia de GregorianCalendar, que representará el mismo momento. Tan fácil como eso, ¿cómo lo hago?

Y para los más rápidos, esto no va a funcionar correctamente:

SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)

porque normalizará la zona horaria a UTC (o la hora de su máquina local, dependiendo de la versión de Java). Lo que necesito es calendar.getTimeZone (). GetRawOffset () para devolver -7 * milisInAnHour .

¿Fue útil?

Solución

Recomendaría buscar en la biblioteca de Joda Time, si esa es una opción. Normalmente estoy en contra de usar una biblioteca de terceros cuando la plataforma central proporciona una funcionalidad similar, pero hice de esto una excepción porque el autor de Joda Time también está detrás de JSR310, y Joda Time básicamente se incluirá en Java 7 con el tiempo.

http://joda-time.sourceforge.net/

De todos modos, si Joda Time es una opción, algo como esto debería funcionar:

DateTimeFormatter formatter =
    DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();

Espero que esto ayude.

Otros consejos

  

Y para los más rápidos, esto no va a funcionar correctamente ...   porque normalizará la zona horaria a UTC (o la hora de su máquina local, dependiendo de la versión de Java). Lo que necesito es calendar.getTimeZone (). GetRawOffset () para devolver -7 * milisInAnHour.

Bueno, técnicamente esto funciona, porque si bien devolverá un objeto con TimeZone igual al sistema TimeZone actual, el tiempo se modificará para dar cuenta del desplazamiento.

Este código:

String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);

Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);

salidas:

  

fecha analizada: lunes 27 de octubre 11:33:29 EDT 2008

que técnicamente es correcto, ya que la zona horaria de mi sistema es EDT / UTC menos cuatro horas (tres horas por delante de la suya). Si expresa el tiempo como el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT (que es la forma en que el objeto Date almacena su fecha / hora), entonces esta fecha / hora son iguales, es solo el TimeZone que es diferente.

Su problema es realmente ¿Cómo convierto una Fecha / Calendario en mi zona horaria? Para eso, vea mi respuesta a la pregunta anterior ¿Cómo manejar las zonas horarias del calendario usando Java?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top