Tengo una clase Java que toma la latitud/longitud de una ubicación y devuelve el desplazamiento GMT cuando el horario de verano está activado y desactivado. Estoy buscando una manera fácil de determinar en Java si la fecha actual está en horario de verano para que pueda aplicar el desplazamiento correcto. Actualmente, solo realizo este cálculo para las zonas horarias de EE. UU. Aunque, finalmente, también me gustaría expandirlo a las zonas horarias globales.Determinar si el horario de verano (DST) está activo en Java para una fecha especificada
Respuesta
Esta es la respuesta de la máquina en la que se pide a la pregunta: ¿
TimeZone.getDefault().inDaylightTime(new Date());
Un servidor tratando de resolver esto para un cliente tendrá la zona horaria del cliente. Vea @Powerlord answer por la razón por la cual.
Para todas las zonas horarias en particular
TimeZone.getTimeZone("US/Alaska").inDaylightTime(new Date());
He estado trabajando en este mismo problema. No he encontrado un archivo de forma para las zonas horarias mundiales. – Clint
Sin embargo, no sabemos si esta es una aplicación de escritorio o una aplicación web. Una aplicación web no tendría acceso a la información de zona horaria en el cliente. – Powerlord
Android: Requiere nivel de API 24 –
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
Se deben evitar tres abreviaturas posteriores, como EST (significadas para tiempos estándar) ya que son insensibles a DST. Use una identificación de zona horaria en su lugar. – Tiny
vas a tener que hacer un poco más de trabajo usando esas coordenadas y averiguar qué zona horaria que se encuentran. Una vez que sepa qué zona horaria que es, el método isDayLight() sería útil.
Por ejemplo, no tiene forma de saber si -0500 es EST (EE. UU./Canadá Hora del Este), CDT (EE. UU./Canadá horario central), COT (hora de Colombia), AST (hora estándar del acre de Brasil) , ECT (hora de Ecuador), etc ...
Algunos de estos pueden o no admitir el horario de verano.
Joda Time contiene métodos de manejo que calcularán los desplazamientos para usted. Ver DateTimeZone.convertLocalToUTC(...)
Para complementar esto, deberá buscar la zona horaria actual con su información de latitud/longitud. GeoNames proporciona un cliente en java para su servicio web, así como un marco sencillo Web-petición (es decir http://ws.geonames.org/timezone?lat=47.01&lng=10.2)
He consultado previamente el servicio web de GeoNames y sé que logrará lo que intento hacer. Lamentablemente, este código se alojará en servidores que pueden estar ubicados detrás de un servidor de seguridad, por lo que estoy tratando de evitar llamadas externas al servicio web si es posible. Para aquellos sin esta restricción, el servicio web de GeoNames sería una gran solución. – gelgamil
tl; dr
ZoneId.of("America/Montreal")
.getRules()
.isDaylightSavings(
Instant.now()
)
java.time
Aquí está la moderna java.time (vea Tutorial) versión del correct Answer por mamboking.
- A
ZoneId
representa una zona horaria. La clase conoce las reglas que dicen si DST se aplica al a particular time zone. - La clase
ZoneRules
modela todas las transiciones históricas y futuras de una zona horaria. - Un
Instant
es un momento en la línea de tiempo en UTC. - A
ZonedDateTime
es el resultado de aplicar unZoneId
a unInstant
.
código Ejemplo:
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Montreal"));
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings(now.toInstant());
Nota cómo en la última línea que tuvimos que extraer un objeto Instant
de nuestro objeto ZonedDateTime
con una simple llamada a toInstant
.
- 1. Cómo verificar si el horario de verano (DST) está vigente y si es el límite?
- 2. Ignorando el horario de verano (DST) en .NET
- 3. ¿Verificar si el horario de verano está en efecto?
- 4. horario de verano en Javascript para 1974?
- 5. ¿UTC observa el horario de verano?
- 6. ¿Cómo determinar cuándo comienza o finaliza el horario de verano en una ubicación específica en Python?
- 7. iPhone - fecha actual teniendo en cuenta el horario de verano
- 8. Horario de verano en Python
- 9. Horario de verano en lubridate
- 10. Tiempo de compensación para horario de verano en una zona horaria específica usando JavaScript
- 11. ¿Cómo verificar si una compensación de tiempo está en horario de verano?
- 12. Horario de verano de Python
- 13. Determinar si la transacción SQLite3 está activo
- 14. Importar fecha-hora en una zona horaria específica, sin tener en cuenta el horario de verano
- 15. Huso horario con horario de verano en PostgreSQL
- 16. En Oracle, ¿cómo puedo detectar la fecha en que comienza o finaliza el horario de verano?
- 17. Programación y horario de verano
- 18. ¿Cómo funciona DateTimeOffset con el horario de verano?
- 19. Hora actual est en java con horario de verano
- 20. restauración de DST bajo Linux en C
- 21. MySQL: DATE_SUB/DATE_ADD que cuenta para DST?
- 22. Cálculo del horario de verano a partir de la única fecha
- 23. Cómo determinar si una fecha está antes de otra
- 24. Ajustar el horario al horario de verano para la hora local C++
- 25. ¿Está afectado .NET Thread.Sleep por los cambios de horario de verano (o del sistema)?
- 26. ¿El operador de diferencia de fecha y hora considera el horario de verano?
- 27. Spring @DateTimeFormat error de conversión con horario de verano
- 28. Convertir hora local a hora UTC o viceversa teniendo en cuenta el horario de verano
- 29. Determinar si el módulo Magento está habilitado
- 30. ¿Cómo determinar si una lista está ordenada en Java?
Actualmente estoy recuperando la información de zona horaria utilizando la biblioteca de GeoTools y un shapefile proporcionado por el Atlas Nacional de los Estados Unidos (http://nationalatlas.gov/mld/timeznp.html). Afortunadamente, esto me proporciona cierta información adicional, principalmente el símbolo de zona horaria que tiene 2 o 4 dígitos (es decir, AL, EA, EAno, etc.). Lamentablemente, este valor no corresponde a los utilizados por las zonas horarias de Java, aunque podría realizar esta asignación de forma manual. Idealmente, me gustaría una solución que funcionaría si reemplazara este archivo con un archivo shape de la zona horaria mundial, pero eso podría ser demasiado ambicioso. – gelgamil
timeznp020.txt enumera 'Dominio_enumerado's que incluyen detalles de cada abreviatura utilizada; no debería ser demasiado difícil asignarlos a los nombres de zona horaria de zoneinfo. No estoy seguro si los nombres de zonas horarias en Java son multiplataforma, ¡pero espero que sí! –
otra respuesta que es útil para este problema http://stackoverflow.com/a/1449510/311525 – Scott