Tl;dr
OffsetDateTime.now().getOffset()
Mais vous devriez probablement utiliser un fuseau horaire plutôt qu'un simple décalage par rapport à l'UTC.
ZoneId.systemDefault()
Décalage par rapport au fuseau horaire
Un site décalage par rapport à l'UTC est simplement un nombre d'heures, de minutes et de secondes, rien de plus. Par exemple, -08:00
signifie huit heures derrière l'UTC, et +05:45
signifie cinq heures et quarante-cinq minutes d'avance sur UTC .
A fuseau horaire es un l'historique des modifications passées, présentes et futures de la compensation utilisés par les habitants d'une région particulière. Des anomalies telles que Heure d'été (DST) Les causes des changements de compensation sur des périodes spécifiques sont suivies dans le temps, dans le passé comme elles se sont produites, et dans le futur lorsque les politiciens ont annoncé des changements prévus.
Alors mieux vaut utiliser une zone lorsqu'il est connu.
Le décalage pour toute région varie dans le temps. Par exemple, L'heure d'été aux États-Unis décale le décalage d'une heure pendant environ la moitié de l'année, puis rétablit cette heure dans le décalage pendant l'autre moitié de l'année. L'objectif d'un fuseau horaire est de documenter ces décalages.
Donc c'est vraiment Cela n'a aucun sens de demander un décalage sans une date-heure. . Sur America/Los_Angeles
Par exemple, pour une partie de l'année, la compensation est la suivante -08:00
mais à un autre moment de l'année, c'est -07:00
pendant le DST.
OffsetDateTime
Spécifions donc un moment comme un OffsetDateTime
puis extraire le ZoneOffset
.
OffsetDateTime odt = OffsetDateTime.now ();
ZoneOffset zoneOffset = odt.getOffset ();
odt.toString(): 2017-01-02T15:19:47.162-08:00
zoneOffset.toString() : -08:00
Ce now
applique en fait implicitement le fuseau horaire par défaut de la JVM. Je vous suggère de toujours le rendre explicite en spécifiant le fuseau horaire souhaité/attendu. Même si vous voulez le fuseau par défaut, dites-le explicitement pour que vos intentions soient claires. Éliminez l'ambiguïté quant à savoir si vous vouliez le fuseau par défaut ou si vous n'avez pas pris en compte le fuseau horaire, comme cela arrive si souvent avec les programmeurs. Appelez ZoneId.systemDefault
.
OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();
ZoneId.systemDefault().toString() : Amérique/Los_Angeles
odt: 2017-01-02T15:19:47.162-08:00
zoneOffsetOfOdt : -08:00
Une mise en garde concernant la dépendance de la zone par défaut : Ce fuseau par défaut peut être modifié à tout moment par n'importe quel code dans n'importe quel thread de la JVM. Si cela est important, demandez à l'utilisateur le fuseau horaire qu'il souhaite utiliser.
Vous pouvez demander au décalage sa durée sous forme de nombre total de secondes.
int offsetSeconds = zoneOffset.getTotalSeconds ();
offsetSeconds : -28800
ZonedDateTime
Un autre exemple : Vous voulez peut-être savoir quel sera le décalage horaire le jour de Noël cette année au Québec. Précisez le fuseau horaire America/Montreal
obtenir un ZonedDateTime
demander son décalage en tant que ZoneOffset
objet.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.of( 2017 , 12 , 25 );
ZonedDateTime zdtXmas = ld.atStartOfDay( z );
ZoneOffset zoneOffsetXmas = zdtXmas.getOffset();
zdtXmas.toString(): 2017-12-25T00:00-05:00[America/Montreal]
zoneOffsetXmas.toString() : -05:00
zoneOffsetXmas.getTotalSeconds() : -18000
ZoneId
Comme suggéré dans le commentaire de yanys, vous pouvez interroger une ZoneId
pour un ZoneOffset
en passant un moment comme Instant
. Le site Instant
représente un moment sur la ligne de temps dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
C'est juste une autre route vers la même destination. Tout comme avec OffsetDateTime
y ZonedDateTime
discuté ci-dessus, nous spécifions (a) un fuseau horaire, et (b) un moment.
Instant instant = zdtXmas.toInstant();
ZoneOffset zo = z.getRules().getOffset( instant );
Pour ZoneId : America/Montreal à l'instant : 2017-12-25T05:00:00Z le ZoneOffset est : -05:00
Voir tous ces exemples' code en direct sur IdeOne.com .
ZoneOffset.systemDefault
- Bug ou fonctionnalité ?
El ZoneOffset
une sous-classe de ZoneId
est documenté comme héritant de l systemDefault
méthode. Cependant, cette méthode ne fonctionne pas réellement.
ZoneOffset zoneOffset = ZoneOffset.systemDefault() ; // Fails to compile.
erreur : types incompatibles : ZoneId ne peut être converti en ZoneOffset
Je ne sais pas si cet échec de la compilation est un bogue ou une caractéristique. Comme discuté ci-dessus, il ne me semble pas logique de demander un décalage par défaut avec une date et une heure, donc peut-être que la méthode de calcul de la date et de l'heure est plus efficace. ZoneOffset.systemDefault
devrait en effet échouer. Mais la documentation devrait le dire, avec une explication.
J'ai essayé de signaler un bogue sur l'incapacité de la doc à résoudre ce problème, mais j'ai abandonné, incapable de déterminer où et comment signaler un tel bogue.
Le temps solaire par rapport au temps politique
Un peu plus sur les décalages et les fuseaux horaires
Heure solaire est utilisé depuis la préhistoire, pour suivre chaque jour en notant le moment où le soleil est directement au-dessus de la tête. Plantez un bâton dans le sol et observez son ombre. Lorsque l'ombre est la plus courte, lorsqu'elle commence à croître plutôt qu'à décroître, vous savez qu'il est midi. Formalisez cela avec un cadran solaire pour suivre les heures qui passent.
Avec l'heure solaire, lorsque vous voyagez de ville en ville en vous déplaçant vers l'ouest, midi arrive un peu plus tard. En allant vers l'est, midi arrive un peu plus tôt. Ainsi, chaque ville a son propre midi, partagé uniquement avec les villes situées au nord et au sud sur la même longitude.
L'heure solaire a été largement abandonnée à l'ère moderne. Avec l'arrivée des trains, des télégraphes et des téléphones, le besoin de coordination temporelle s'est fait sentir. Ainsi, un point a été choisi pour sa proximité de l'heure solaire de midi, et une large bande de terre de plusieurs kilomètres à l'ouest et à l'est a été déclarée comme partageant le même 12:00 sur l'horloge, l'heure solaire. le même nombre d'heures de décalage devant ou derrière le Méridien d'origine de Greenwich ligne . C'est ainsi qu'est née la tradition qui veut que chaque arrêt de train affiche bien en évidence une horloge pour informer la ville de l'arrivée du train. heure normale pour leur grande région plutôt que l'heure solaire pour leur propre ville. En général, les villes situées à l'ouest de ce fuseau horaire verront l'horloge de leur gare afficher 12 heures un peu plus tard. antes de le soleil est au-dessus de nos têtes. Les horloges des villes situées à l'est de la région indiquent 12 heures un peu plus tard. après le soleil est au-dessus de nos têtes.
Les politiciens du monde entier ont montré un penchant pour la modification du ou des décalages de leur juridiction. Les raisons varient, telles que la diplomatie, la guerre et l'occupation, et l'absurdité de l'utilisation de l'argent. Heure d'été (DST) . Les raisons varient, mais les changements surviennent avec une fréquence surprenante. Un fuseau horaire est un nom donné à une région pour retracer l'historique de ces changements. Ainsi, un décalage par rapport à l'UTC est simplement un nombre d'heures-minutes-secondes devant ou derrière le méridien d'origine. A Le fuseau horaire est bien plus que cela : une histoire des changements passés, présents et futurs des décalages d'une région particulière. Alors que deux régions voisines peuvent aujourd'hui partager le même décalage par rapport au CUT, dans le passé ou dans le futur, elles peuvent différer en fonction des caprices ou de la logique de leurs politiciens.
Ainsi, l'heure moderne définie par les politiciens n'a pas grand-chose à voir avec la géographie. Par exemple, l'immense pays qu'est l'Inde a aujourd'hui un seul fuseau horaire (décalage par rapport à l'UTC de +05:30). Ainsi, le midi solaire (soleil directement au-dessus de votre tête) est décalé de plusieurs heures en divers endroits du vaste sous-continent. Les politiciens indiens en ont décidé ainsi afin de contribuer à unifier leur démocratie diversifiée. Dans d'autres exemples à travers le monde, nous voyons des régions utiliser leur fuseau horaire comme un symbole pour les relations internationales, par exemple en étant différent de leur pays voisin offensant, ou en choisissant le même fuseau que leur voisin lorsque les relations se détendent, comme on l'a vu récemment avec la Corée du Nord qui a changé pour s'aligner sur la Corée du Sud. Ainsi, de nos jours, l'heure solaire n'est qu'un élément parmi d'autres à prendre en compte dans le suivi du temps.
À propos de java.time
El java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .
El Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.
Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.*
classes. Support de Hibernate 5 et JPA 2.2 java.time .
Où obtenir les classes java.time ?
0 votes
Essayez
ZoneOffset.systemDefault()
2 votes
De nombreux fuseaux horaires ont des décalages différents en raison de l'heure d'été.
26 votes
ZoneOffset.systemDefault()
renvoie unZoneId
mais4 votes
Le ZoneOffset actuel est une fonction de ZoneId et de Instant.
ZoneOffset current = zone.getRules().getOffset(instant)
0 votes
@yanys cet instant provient de Instant.now() ?
0 votes
@FredSuvn si vous voulez connaître ZoneId pour le moment, alors oui, c'est le cas.
0 votes
@yanys Je ne comprends pas pourquoi un zoneoffset est influencé par un instant. Une zoneoffset n'est pas fixe ?
4 votes
@FredSuvn Je crois que yanys veut dire que cela n'a pas de sens de demander un décalage sans spécifier un fuseau horaire et un moment (une valeur date-heure). Ex : l'heure d'été en
America/Los_Angeles
fait en sorte que le décalage soit-08:00
actuellement, mais les modifications apportées à-07:00
en été. Vous ne pouvez donc pas demander une compensation sans dire lorsqu'il est en vigueur et pour quel fuseau horaire . Ver ma réponse pour plus de discussion.