Obtenga fechas de transición para ahorrar durante el día para las zonas horarias en Java
Pregunta
Me gustaría saber la forma más sencilla, en Java, para obtener una lista de fechas en el futuro donde cambiará el tiempo de ahorro de luz de día.
Una forma bastante inellegadora de hacer esto sería simplemente iterar durante un montón de años de días, probándolos contra Timelone.IndayLightTime (). Esto funcionará, y no me preocupa la eficiencia, ya que esto solo necesitará ejecutarse cada vez que comience mi aplicación, pero me pregunto si hay una manera más simple.
Si se pregunta por qué estoy haciendo esto, es porque tengo una aplicación JavaScript que necesita manejar datos de terceros que contengan marcas de tiempo UTC. Quiero una forma confiable de traducir de GMT a EST en el lado del cliente. Ver JavaScript - Hora de unix a zona horaria específica He escrito algunos JavaScript que lo harán, pero quiero obtener fechas de transición precisas del servidor.
Solución
Tiempo de Joda (como siempre) lo hace realmente fácil debido a la DateTimeZone.nextTransition
método. Por ejemplo:
import org.joda.time.*;
import org.joda.time.format.*;
public class Test
{
public static void main(String[] args)
{
DateTimeZone zone = DateTimeZone.forID("Europe/London");
DateTimeFormatter format = DateTimeFormat.mediumDateTime();
long current = System.currentTimeMillis();
for (int i=0; i < 100; i++)
{
long next = zone.nextTransition(current);
if (current == next)
{
break;
}
System.out.println (format.print(next) + " Into DST? "
+ !zone.isStandardOffset(next));
current = next;
}
}
}
Producción:
25-Oct-2009 01:00:00 Into DST? false 28-Mar-2010 02:00:00 Into DST? true 31-Oct-2010 01:00:00 Into DST? false 27-Mar-2011 02:00:00 Into DST? true 30-Oct-2011 01:00:00 Into DST? false 25-Mar-2012 02:00:00 Into DST? true 28-Oct-2012 01:00:00 Into DST? false 31-Mar-2013 02:00:00 Into DST? true 27-Oct-2013 01:00:00 Into DST? false 30-Mar-2014 02:00:00 Into DST? true 26-Oct-2014 01:00:00 Into DST? false 29-Mar-2015 02:00:00 Into DST? true 25-Oct-2015 01:00:00 Into DST? false ...
Con Java 8, puede obtener la misma información utilizando ZoneRules
con su nextTransition
y previousTransition
métodos.
Otros consejos
java.time
La respuesta moderna usa Java.Time, la moderna API de fecha y hora de Java.
ZoneId zone = ZoneId.of("Europe/London");
ZoneRules rules = zone.getRules();
ZonedDateTime now = ZonedDateTime.now(zone);
ZoneOffsetTransition transition = rules.nextTransition(now.toInstant());
Instant max = now.plusYears(15).toInstant();
while (transition != null && transition.getInstant().isBefore(max)) {
System.out.println(transition);
transition = rules.nextTransition(transition.getInstant());
}
Salida, abreviada:
Transition[Overlap at 2019-10-27T02:00+01:00 to Z] Transition[Gap at 2020-03-29T01:00Z to +01:00] Transition[Overlap at 2020-10-25T02:00+01:00 to Z] Transition[Gap at 2021-03-28T01:00Z to +01:00] Transition[Overlap at 2021-10-31T02:00+01:00 to Z] Transition[Gap at 2022-03-27T01:00Z to +01:00] Transition[Overlap at 2022-10-30T02:00+01:00 to Z] (cut) Transition[Overlap at 2033-10-30T02:00+01:00 to Z] Transition[Gap at 2034-03-26T01:00Z to +01:00]
Sin embargo, no confiaría demasiado en los datos. No estoy seguro de qué sucede con el tiempo en el Reino Unido después del Brexit (y después de la UE puede abandonar el tiempo de verano (DST) en 2021).
Enlace: Tutorial de Oracle: fecha de fecha Explicando cómo usar Java.Time.