Obtenga fechas de transición para ahorrar durante el día para las zonas horarias en Java

StackOverflow https://stackoverflow.com/questions/1449500

  •  11-09-2019
  •  | 
  •  

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.

¿Fue útil?

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.

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