obtener - set zona horaria java
En tiempo joda, cómo convertir la zona horaria sin cambiar el tiempo (5)
Puede usar la clase LocalDateTime
LocalDateTime dt = new LocalDateTime(t.getTime());
y convierte LocalDateTime
a DateTime
DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC);
Joda DateTime
trata cualquier momento en millis como "millis desde 1970y en la zona horaria actual ". Por lo tanto, cuando crea una instancia de DateTime
, se crea con la zona horaria actual.
Recibo la marca de tiempo UTC de la base de datos, que es la que configuro en una instancia de JodaTime DateTime
DateTime dt = new DateTime(timestamp.getTime());
Almacena el tiempo perfectamente, digamos a las 10:00 AM
pero con la zona horaria local. Por ejemplo, estoy en zona horaria IST, que es +5: 30 de UTC
He intentado muchas cosas para cambiar la zona horaria, pero con cada cosa cambia el horario de 10:00 AM
a otra cosa usando +5: 30 diferencia
¿Hay alguna manera por la que puedo cambiar TimeZone sin afectar la hora actual
EDITAR: Si mi hora actual es:
2013-09-25 11:27:34 AM UTC
A continuación se muestra el resultado cuando uso este new DateTime(timestamp.getTime());
2013-09-25 11:27:34 AM Asia/Kolkata
Y el siguiente es el resultado cuando uso este new DateTime(timestamp.getTime(), DateTimeZone.UTC)
;
2013-09-25 05:57:34 AM UTC
Puede utilizar el método withZoneRetainFields()
de DateTime
para modificar la zona horaria sin alterar los números en la fecha.
Así es como lo hago:
private DateTime convertLocalToUTC(DateTime eventDateTime) {
// get your local timezone
DateTimeZone localTZ = DateTimeZone.getDefault();
// convert the input local datetime to utc
long eventMillsInUTCTimeZone = localTZ.convertLocalToUTC(eventDateTime.getMillis(), false);
DateTime evenDateTimeInUTCTimeZone = new DateTime(eventMillsInUTCTimeZone);
return evenDateTimeInUTCTimeZone.toDate();
}
Si su marca de tiempo es: 2015-01-01T00: 00: 00.000-0500 (esta es la hora local [para mí])
Prueba esto:
DateTime localDt = new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
.withZone(DateTimeZone.getDefault());
2014-12-31T19: 00: 00.000-05: 00
Desglosándolo: le da un DateTime correspondiente a su marca de tiempo, especificando que está en UTC:
new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
2015-01-01T00: 00: 00.000Z
Esto le da un DateTime pero con el tiempo convertido a su hora local:
new DateTime(timestamp.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
.withZone(DateTimeZone.getDefault());
2014-12-31T19: 00: 00.000-05: 00
También tengo otro enfoque que fue muy útil para mí. Quería que mi hilo de flujo de trabajo cambiara temporalmente a una zona horaria específica (conservando el tiempo), y luego, cuando mi código termine, configuré la zona horaria original nuevamente. Resulta que cuando estás usando bibliotecas joda, haces:
TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone));
TimeZone.setDefault(timeZone);
No es suficiente. También necesitamos cambiar el TimeZone en DateTimeZone de la siguiente manera:
@Before
public void setUp() throws Exception {
timeZone = TimeZone.getDefault();
dateTimeZone = DateTimeZone.getDefault();
}
@After
public void tearDown() throws Exception {
TimeZone.setDefault(timeZone);
DateTimeZone.setDefault(dateTimeZone);
}
@Test
public void myTest() throws Exception {
TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone));
DateTimeZone.setDefault(DateTimeZone.forID(myTempTimeZone));
//TODO
// my code with an specific timezone conserving time
}
Espero que ayude a alguien más también.