web-dev-qa-db-fra.com

Déterminer si l'heure d'été (DST) est active dans Java pour une date spécifiée

J'ai une classe Java qui prend la latitude/longitude d'un emplacement et renvoie le décalage GMT lorsque l'heure d'été est activée et désactivée. Je cherche un moyen facile de déterminer dans Java si la date actuelle est en heure d'été afin que je puisse appliquer le décalage correct. Actuellement, je n'effectue ce calcul que pour les fuseaux horaires américains, bien que j'aimerais éventuellement l'étendre également aux fuseaux horaires mondiaux.

52
gelgamil

Voici la réponse pour la machine sur laquelle la question est posée:

TimeZone.getDefault().inDaylightTime( new Date() );

Un serveur essayant de comprendre cela pour un client aura besoin du fuseau horaire du client. Voir la réponse @Powerlord pour la raison.

Pour une TimeZone particulière

TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
67
Clint

tl; dr

ZoneId.of( "America/Montreal" )  // Represent a specific time zone, the history of past, present, and future changes to the offset-from-UTC used by the people of a certain region.  
      .getRules()                // Obtain the list of those changes in offset. 
      .isDaylightSavings(        // See if the people of this region are observing Daylight Saving Time at a specific moment.
          Instant.now()          // Specify the moment. Here we capture the current moment at runtime. 
      )                          // Returns a boolean.

Java.time

Voici la version moderne Java.time (voir Tutoriel ) de la réponse correcte par mamboking .

Exemple de code:

ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );

Notez comment dans la dernière ligne nous avons dû extraire un objet Instant de notre objet ZonedDateTime avec un simple appel à toInstant .


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien hérité) gênant classes date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes Java.time .

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .

Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* Des classes.

Où obtenir les classes Java.time?

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter , et plus .

29
Basil Bourque
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
10
mamboking

Vous devrez faire un peu plus de travail en utilisant ces coordonnées et déterminer dans quel fuseau horaire elles se trouvent. Une fois que vous savez de quel fuseau horaire il s'agit, la méthode isDayLight () serait utile.

Par exemple, vous n'avez aucun moyen de savoir si -0500 est EST (heure normale de l'Est des États-Unis/Canada), CDT (heure avancée du centre des États-Unis/Canada), COT (heure de Colombie), AST ( Heure standard du Brésil Acre), ECT (heure de l'Équateur), etc ...

Certains d'entre eux peuvent ou non prendre en charge l'heure d'été.

3
Powerlord

Joda Time contient des méthodes de manipulation qui calculeront les décalages pour vous. Voir DateTimeZone.convertLocalToUTC (...)

Pour compléter cela, vous devrez rechercher le fuseau horaire actuel avec vos informations de latitude/longitude. GeoNames fournit un Java pour son service Web, ainsi qu'un simple cadre de demande Web (c.-à-d. http://ws.geonames.org /timezone?lat=47.01&lng=10.2 )

1
James Van Huis