2009-06-29 28 views
44

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

+0

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

+0

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í! –

+0

otra respuesta que es útil para este problema http://stackoverflow.com/a/1449510/311525 – Scott

Respuesta

56

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()); 
+1

He estado trabajando en este mismo problema. No he encontrado un archivo de forma para las zonas horarias mundiales. – Clint

+0

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

+0

Android: Requiere nivel de API 24 –

9
TimeZone tz = TimeZone.getTimeZone("EST"); 
boolean inDs = tz.inDaylightTime(new Date()); 
+3

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

3

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.

1

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)

+0

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

18

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 un ZoneId a un Instant.

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.

Cuestiones relacionadas