J'ai analysé un à java.util.Date
partir d'un String
mais il définit le fuseau horaire local comme fuseau horaire de l' date
objet.
Le fuseau horaire n'est pas spécifié dans celui à String
partir duquel Date
est analysé. Je veux définir un fuseau horaire spécifique de l' date
objet.
Comment puis je faire ça?
java
date
timezone
java.util.date
Yatendra Goel
la source
la source
Réponses:
Utilisez DateFormat. Par exemple,
la source
TimeZone.setDefault()
avant d'appelergetTime()
pour que le nouvel objet date soit dans le fuseau horaire de votre choix. Dans JDK 1.8, lesCalendar.getTime()
appelsreturn new Date(getTimeInMillis());
.Sachez que les
java.util.Date
objets ne contiennent aucune information de fuseau horaire par eux-mêmes - vous ne pouvez pas définir le fuseau horaire sur unDate
objet. La seule chose qu'unDate
objet contient est un nombre de millisecondes depuis "l'époque" - 1er janvier 1970, 00:00:00 UTC.Comme le montre le codeur ZZ, vous définissez le fuseau horaire sur l'
DateFormat
objet, pour lui indiquer dans quel fuseau horaire vous souhaitez afficher la date et l'heure.la source
long
champ appeléfastTime
.Date.toString()
utilise en fait unCalendar
pour interpréter cette milliseconde fois. L'impression d'unDate
fichier semble donc avoir un fuseau horaire (par défaut), ce qui conduit à des questions compréhensibles sur la façon de définir ce fuseau horaire.tl; dr
Aucun fuseau horaire dans juDate
Comme les autres bonnes réponses l'ont indiqué, un java.util.Date n'a pas de fuseau horaire † . Il représente UTC / GMT (pas de décalage de fuseau horaire). Très déroutant car sa
toString
méthode applique le fuseau horaire par défaut de la JVM lors de la génération d'une représentation String.Évitez juDate
Pour cela et pour bien d'autres raisons, vous devez éviter d'utiliser le java.util.Date & .Calendar & java.text.SimpleDateFormat intégré. Ils sont notoirement gênants.
Utilisez plutôt le package java.time fourni avec Java 8 .
java.time
Les classes java.time peuvent représenter un moment sur la timeline de trois manières:
Instant
)OffsetDateTime
avecZoneOffset
)ZonedDateTime
avecZoneId
)Instant
Dans java.time , le bloc de construction de base est
Instant
, un moment sur la ligne de temps en UTC. Utilisez desInstant
objets pour une grande partie de votre logique métier.OffsetDateTime
Appliquez un décalage par rapport à l'UTC pour ajuster le temps d'horloge murale d' une localité .
Appliquez un
ZoneOffset
pour obtenir unOffsetDateTime
.ZonedDateTime
Il vaut mieux appliquer un fuseau horaire , un décalage ainsi que les règles de gestion des anomalies telles que l' heure d'été (DST) .
Appliquez un
ZoneId
à unInstant
pour obtenir unZonedDateTime
. Spécifiez toujours un nom de fuseau horaire correct . N'utilisez jamais 3-4 abréviations telles queEST
ouIST
qui ne sont ni uniques ni standardisées.LocalDateTime
Si la chaîne d'entrée n'avait aucun indicateur de décalage ou de zone, analysez comme a
LocalDateTime
.Si vous êtes certain du fuseau horaire prévu, attribuez a
ZoneId
pour produire aZonedDateTime
. Voir l'exemple de code ci-dessus dans la section tl; dr en haut.Chaînes formatées
Appelez la
toString
méthode sur l'une de ces trois classes pour générer une chaîne représentant la valeur date-heure au format ISO 8601 standard. LaZonedDateTime
classe étend le format standard en ajoutant le nom du fuseau horaire entre parenthèses.Pour d'autres formats, utilisez la
DateTimeFormatter
classe. Il est généralement préférable de laisser cette classe générer des formats localisés en utilisant le langage humain et les normes culturelles attendus de l'utilisateur. Ou vous pouvez spécifier un format particulier.À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
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.*
cours.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 trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .Joda-Time
Bien que Joda-Time soit toujours activement maintenu, ses fabricants nous ont dit de migrer vers java.time dès que cela serait pratique. Je laisse cette section intacte comme référence, mais je suggère d'utiliser la
java.time
section ci-dessus à la place.Dans Joda-Time , un objet date-heure (
DateTime
) connaît vraiment son fuseau horaire attribué. Cela signifie un décalage par rapport à l'UTC et aux règles et à l'historique de l'heure d'été (DST) de ce fuseau horaire et à d'autres anomalies de ce type.Appelez la
toString
méthode pour générer une chaîne au format ISO 8601 .Joda-Time offre également de riches capacités pour générer toutes sortes d'autres formats de chaîne.
Si nécessaire, vous pouvez convertir Joda-Time DateTime en java.util.Date.
Recherchez StackOverflow pour "date Joda" pour trouver de nombreux autres exemples, certains assez détaillés.
† En fait, il y a un fuseau horaire intégré dans un java.util.Date, utilisé pour certaines fonctions internes (voir les commentaires sur cette réponse). Mais ce fuseau horaire interne n'est pas exposé en tant que propriété et ne peut pas être défini. Ce fuseau horaire interne n'est pas celui utilisé par la
toString
méthode pour générer une représentation sous forme de chaîne de la valeur date-heure; au lieu de cela, le fuseau horaire par défaut actuel de la JVM est appliqué à la volée. Donc, en sténographie, nous disons souvent «juDate n'a pas de fuseau horaire». Déroutant? Oui. Encore une autre raison d'éviter ces vieilles classes fatiguées.la source
BaseCalendar.Date cdate
propriété si elle est définie. Jetez un œil au code source ici . Vous ne pouvez pas définir le fuseau horaire d'un objet juDate, sauf en modifiant le fuseau horaire par défaut de la JVM en appelantTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Ainsi, il y a un décalage de fuseau horaire et vous pouvez obtenir le décalage en appelant la méthode obsolète juDate.getTimezoneOffset ()toString
méthode qui applique le fuseau horaire par défaut actuel de la JVM; ignorant à nouveau le fuseau horaire enfoui. Donc, par souci de concision, nous disons qu'un java.util.Date n'a pas de fuseau horaire. Comme l'art , c'est un mensonge qui dit la vérité.TimeZone.setDefault
, vous ne définissez pas le fuseau horaire de l'objet java.util.Date - l'objet Date ignore toujours son fuseau horaire enfoui, agissant efficacement en UTC. Vous affecteriez latoString
méthode de Date . La définition de la valeur par défaut modifie le fuseau horaire par défaut de la JVM qui est généralement défini sur le fuseau horaire du système d'exploitation hôte. Cet appel n'est pas recommandé car il affecte tout le code dans tous les threads de toutes les applications exécutées dans cette machine virtuelle Java, et le fait à la volée pendant leur exécution. Étant grossier et dangereux, cet appel ne devrait être considéré qu'en dernier recours.equals
,hashcode
,getTime
..) Si vous jetez un oeil à laequals
méthode, il appellegetTime()
qui appellegetTimeImpl()
, qui appellenormalize()
si lacdate
propriété est pas normalisée. Dans lanormalize()
méthode, la dernière condition if recalcule les millisecondes depuis le 1/1/70 en fonction des informations de fuseau horaire stockées si le fuseau horaire decdate
est différent du fuseau horaire de l'environnement JVM actuel sur lequel il s'exécute. (Jetez un oeil àsun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Vous pouvez également définir le fuseau horaire au niveau JVM
production:
la source
TimeZone.setDefault
sont assez drastiques, car ils affectent l'ensemble de la JVM, affectent tous les autres objets et threads. Voir cette réponse pour plus de détails, y compris encore plus de complications si vous utilisez un SecurityManager. Ajouter encore plus de complication: ce comportement a changé dans différentes versions de Java, comme indiqué dans cette question .Si vous ne devez travailler qu'avec des classes JDK standard, vous pouvez utiliser ceci:
Le mérite revient à ce poste .
la source
java.util.Calendar
est la manière habituelle de gérer les fuseaux horaires en utilisant uniquement les classes JDK. Apache Commons propose d'autres alternatives / utilitaires qui peuvent être utiles. La note de Edit Spong m'a rappelé que j'avais entendu de très bonnes choses à propos de Joda-Time (même si je ne l'ai pas utilisé moi-même).la source
Period
,Duration
etInterval
. Ces portées comprennent des méthodes de comparaison tels quecontains
,abuts
,overlap
etgap
. EtPeriodFormatterBuilder
peut construire des phrases descriptives telles que "15 ans et 8 mois".Convertissez la date en chaîne et faites-le avec SimpleDateFormat.
la source
Si quelqu'un en a besoin, si vous devez convertir un
XMLGregorianCalendar
fuseau horaire en fuseau horaire UTC, il vous suffit de définir le fuseau horaire0
, puis d'appelertoGregorianCalendar()
- il restera le même fuseau horaire, mais leDate
sait comment le convertir en le vôtre, afin que vous puissiez obtenir les données à partir de là.Résultat:
la source
Ce code a été utile dans une application sur laquelle je travaille:
la source