Encuentra marca de tiempo de transición horario de verano con java.util.TimeZone

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

  •  06-09-2019
  •  | 
  •  

Pregunta

¿Es posible llegar a la marca de tiempo anterior y la siguiente transición horario de verano con el Calendario de Java / Fecha / API zona horaria?
Con Joda-Time Puedo escribir:

DateMidnight today = new DateMidnight(2009, 2, 24);
DateTimeZone zone = today.getZone();

DateTime previousTransition =
    new DateTime(zone.previousTransition(today.getMillis()));
// 2008-10-26T02:59:59.999+02:00 for Europe/Berlin
System.out.println(previousTransition);

DateTime nextTransition =
    new DateTime(zone.nextTransition(today.getMillis()));
// 2009-03-29T03:00:00.000+02:00 for Europe/Berlin
System.out.println(nextTransition);

¿Hay manera de hacer esto con las API estándar de Java?

¿Fue útil?

Solución

No hay tal funcionalidad en Java Fecha / API Calendario / zona horaria

Otros consejos

Lo mejor que se me ocurrió, cuando necesitaba dicha funcionalidad, es utilizar un calendario e iterar a través de todo el año, en la zona de tiempo especificado, y preguntar si cada hora de cada día es el año del principio o el final de DST.

Hay que hacerlo así porque en la máquina virtual Java de Sun, la implementación de zona horaria (sun.util.calendar.ZoneInfo) contiene datos sobre las transiciones de zona horaria en algún tipo de forma "compilado".

Código es algo como esto:

public class Dst {
    Date start;
    Date end;

    public static Dst calculate(TimeZone tz, int year) {
        final Calendar c = Calendar.getInstance(tz);
        c.setLenient(false);
        c.set(year, Calendar.JANUARY, 1, 1, 0, 0);
        c.set(Calendar.MILLISECOND, 0);

        if (tz.getDSTSavings() == 0) {
            return null;
        }

        Dst dst = new Dst();

        boolean flag = false;

        do {
            Date date = c.getTime();
            boolean daylight = tz.inDaylightTime(date);

            if (daylight && !flag) {
                flag = true;
                dst.start = date;
            }
            else if (!daylight && flag) {
                flag = false;
                dst.end = date;
            }

            c.add(Calendar.HOUR_OF_DAY, 1);
        }
        while (c.get(Calendar.YEAR) == year);

        return dst;
    }
}

Por supuesto, tendría sentido cache / memoize el resultado de estos cálculos, etc.

Espero que esto ayude.

Con Java 8 se puede utilizar el

ZoneRules#nextTransition(Instant) 

&

ZoneRules#previousTransition(Instant) 

Los métodos para hacer lo mismo.

https://docs.oracle .com / JavaSE / 8 / docs / api / java / hora / zona / ZoneRules.html

Sí, hay una manera indirecta para recuperar esto desde la API de Java. Comprobar esto y quiero saber si esto funciona para el problema:

http://monisiqbal.blogspot.com /2009/12/retrieving-time-zones-dst-information.html

Esto debe darle la información requerida para el año en curso, se puede hacer fácilmente el mismo de años anteriores, si así lo desea.

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