java - mexico - timezone gettimezone gmt 3
Usando Joda-Time para obtener el desplazamiento UTC para una fecha y zona horaria determinadas (5)
Si solo necesita el desplazamiento de la zona horaria, use DateTimeZone.forID()
para obtener el huso horario y luego tz.getOffset(instant)
para obtener el desplazamiento a UTC en milisegundos.
Puede parecer extraño que necesite un instante para calcular el desplazamiento a UTC, pero esto es necesario para tener en cuenta el horario de verano y los cambios en la zona horaria. Sí, los países cambian sus husos horarios de vez en cuando:
¿Por qué cambian los datos de la zona horaria?
La configuración de la zona horaria se adopta localmente y no existe una autoridad de zona horaria mundial.
EDITAR Esto le da el resultado correcto:
DateTimeFormatter dtf1 = DateTimeFormat.forPattern("ddMMMYYYY");
DateTimeZone zone = DateTimeZone.forID("Australia/Melbourne");
DateTime thisDate = dtf1.parseDateTime("30Jul2013").withZone(zone);
assertEquals( 10 * CommonConstants.MILLISECONDS_PER_HOUR,
zone.getOffset( thisDate ) );
thisDate.get
Tengo fechas en el formato 20Jan2013, 08Aug2012, etc., con sus propias zonas horarias específicas. Entonces, por ejemplo, 20Jan2013 podría tener una identificación de zona horaria de Australia / Melbourne, y 08Aug2012 podría tener una identificación de Europa / Londres. Lo que quiero hacer es, en base a estas zonas horarias y las fechas, calcular el desplazamiento UTC para esa zona horaria en la fecha indicada. He llegado a esto hasta ahora:
DateTimeFormatter dtf = DateTimeFormat.forPattern("ZZ");
DateTimeFormatter dtf1 = DateTimeFormat.forPattern("ddMMMYYYY");
DateTimeZone zone = DateTimeZone.forID("Australia/Melbourne");
DateTime thisDate = dtf1.parseDateTime("30Jul2013");
System.out.println("/nZone: " + thisDate.withZone(zone));
Esto me da el resultado:
Zone: 2013-07-30T00:00:00.000+10:00
Esto es correcto, pero me gustaría extraer solo el desplazamiento UTC de esto, que en este caso es +10: 00. He buscado formas de hacerlo pero no puedo encontrar nada. ¿Hay alguna manera de que pueda hacer esto? La única opción que veo es convertir el resultado en una cadena y usar el método de subcadena para obtener el desplazamiento UTC.
El código anterior tiene en cuenta el horario de verano (DST). Entonces, por ejemplo, si tuviera: DateTime thisDate = dtf1.parseDateTime ("30Jan2013");
La salida sería: 2013-01-30T00: 00: 00,000 + 11: 00
(+11: 00 al final en lugar de +10: 00)
Entonces, básicamente, todo lo que tengo que hacer es encontrar una forma de extraer +11: 00 de 2013-07-30T00: 00: 00,000 + 11: 00. ¡Por favor ayuda!
Para que Joda dé el desplazamiento correcto, debe proporcionar un instante de fecha y hora. Sin un instante de fecha y hora, es imposible calcular el desplazamiento ya que tenemos diferentes compensaciones (ahorro de luz diurna). Así es como usaría Joda para obtener el desplazamiento en formato + HH: mm:
int offsetInMillis = DateTimeZone.forID(zoneId).getOffset(new DateTime().getMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000),
Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
Método simple para obtener el nombre de la zona horaria y el desplazamiento en horas
public static String getCurrentTimeZoneOffset() {
DateTimeZone tz = DateTimeZone.getDefault();
Long instant = DateTime.now().getMillis();
String name = tz.getName(instant);
long offsetInMilliseconds = tz.getOffset(instant);
long hours = TimeUnit.MILLISECONDS.toHours( offsetInMilliseconds );
String offset = Long.toString( hours );
return name + " (" + offset + " Hours)";
// Example: "Mountain Standard Time (-7 Hours)"
}
Advertencias de pareja:
- Esto obtiene la
DateTimeZone
predeterminada de JodaTime . Puede modificarlo para aceptar un DateTimeZone específico que se pasa al método. - Esto lo devuelve en un formato como " Mountain Standard Time (-7 Hours) ", pero puede formatearlo como mejor le parezca.
Espero que ayude.
JP
Cuando conoces el desplazamiento y la marca de tiempo, para obtener la hora actual, puedes usar
public static String formatMonthDayMinuteByGivenUtcOffset(long timestamp, int offset) {
return JODA_FORMATTER.print(createDateTime(timestamp, offset));
}
Java 8 introdujo un mejor manejo de fecha y hora para abordar algunas de las limitaciones previas del idioma en esa área. Algunos de mis proyectos comenzaron a usarlo en lugar de Joda.
Usando el paquete java.time:
ZonedDateTime dateTime = LocalDate.of(2013 , 1 , 20).atStartOfDay( ZoneId.of("Australia/Melbourne"));
ZoneOffset zo = dateTime.getOffset();
int offset = zo.getTotalSeconds();
long hours = TimeUnit.SECONDS.toHours(offset);
long minutes = TimeUnit.SECONDS.toMinutes(offset % 3600);
La variable horas se establece en 11 y los minutos en 0.
También calcula el desplazamiento de minutos, para zonas horarias que son horas parciales, como Terranova y Labrador en el este de Canadá:
ZonedDateTime dateTime = LocalDate.of(2013, 1, 20).atStartOfDay( ZoneId.of("Canada/Newfoundland"));
En este caso, la compensación es -03:30
(tres horas y media detrás de UTC), las hours
son -3 y los minutes
son -30.
Para la representación de String, en lugar del número entero de horas y minutos, use el método ZoneSofing toString (). Entonces, para el ejemplo anterior, usa:
String offsetString = zo.toString();