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.
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() );
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.
Voici la version moderne Java.time (voir Tutoriel ) de la réponse correcte par mamboking .
ZoneId
représente un fuseau horaire. La classe connaît les règles qui indiquent si DST s'applique à n fuseau horaire particulier .ZoneRules
modélise toutes les transitions historiques et futures d'un fuseau horaire.Instant
est un moment de la chronologie dans UTC .ZonedDateTime
est le résultat de l'application d'un ZoneId
à un Instant
.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
.
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 .
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
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é.
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 )