Comment définir le fuseau horaire de java.util.Date?
J'ai analysé un java.util.Date
à partir d'un String
mais c'est le réglage de l'heure locale de la zone que la zone de la date
objet.
Le fuseau horaire n'est pas spécifié dans le String
à partir de laquelle Date
est analysée. Je veux fixer une heure précise de la zone de la date
objet.
Comment puis-je le faire?
- Bien que pas vraiment de réponse à votre question, j'ai utilisé Joda de Temps après l'avoir vu mentionné ici quelques temps. Il semble plus rationnel de moi que les Api standard, et peut faire ce genre de chose assez facilement.
- De nos jours, l'utilisation de java.les classes de temps plutôt que de Joda-Time. Le Joda-Time le projet est maintenant dans mode de maintenance, avec l'équipe conseiller de migration de la java.de temps les classes. Voir Tutoriel Oracle.
Vous devez vous connecter pour publier un commentaire.
Utilisation DateFormat. Par exemple,
TimeZone.setDefault()
avant d'appelergetTime()
de sorte que la nouvelle date objet sera dans le fuseau horaire que vous souhaitez. Dans le JDK 1.8,Calendar.getTime()
appelsreturn new Date(getTimeInMillis());
.Être conscient que
java.util.Date
objets ne contiennent pas d'informations sur le fuseau horaire par eux - mêmes, vous ne pouvez pas régler le fuseau horaire sur unDate
objet. La seule chose qu'unDate
objet contient un certain nombre de millisecondes écoulées depuis l'époque" - 1 janvier 1970, 00:00:00 UTC.Comme ZZ Codeur montre, vous réglez le fuseau horaire sur le
DateFormat
objet, pour le dire fuseau horaire dans lequel vous souhaitez afficher la date et l'heure.long
champ appeléfastTime
.Date.toString()
utilise en fait unCalendar
d'interpréter ce temps milliseconde. Donc, l'impression d'uneDate
rend semble pour avoir un (par défaut) fuseau horaire, conduisant à des compréhensible questions sur la façon de définir le fuseau horaire.tl;dr
Pas de Temps dans la Zone j.u.Date
Que les autres réponses correctes dit, une java.util.La Date n'a pas le temps de la zone†. Il représente UTC/GMT (pas de décalage horaire). Très déroutant parce que son
toString
méthode s'applique à la JVM du fuseau horaire par défaut lors de la génération d'une représentation sous forme de Chaîne.Éviter de j.u.Date
Pour cela et pour bien d'autres raisons, vous devriez éviter d'utiliser le construit en java.util.Date & .Calendrier & java.texte.SimpleDateFormat. Ils sont très gênants.
Au lieu d'utiliser l' java.en temps livré avec Java 8.
java.temps
La java.les classes de temps peut représenter un moment sur le scénario de trois façons:
Instant
)OffsetDateTime
avecZoneOffset
)ZonedDateTime
avecZoneId
)Instant
Dans java.le temps, le bloc de construction de base est
Instantané
, un moment, sur la ligne de temps en temps UTC. UtilisationInstant
objets pour une grande partie de votre logique métier.OffsetDateTime
Appliquer une offset-de-UTC à régler dans une localité du horloge murale.
Appliquer un
Écartfuseau
pour obtenir unOffsetDateTime
.ZonedDateTime
Mieux est d'appliquer un fuseau horaire, un décalage plus les règles de traitement des anomalies telles que des Heure d'été (DST).
Appliquer un
ZoneId
à unInstant
pour obtenir unZonedDateTime
. Toujours spécifier une fuseau horaire nom. N'utilisez jamais de 3-4 abréviations telles queEST
ouIST
qui ne sont ni uniques ni standardisé.LocalDateTime
Si la chaîne d'entrée n'avait pas un indicateur de décalage ou de la zone, l'analyser comme un
LocalDateTime
.Si vous êtes certain de la date prévue de la zone, d'attribuer une
ZoneId
pour produire unZonedDateTime
. Voir l'exemple de code ci-dessus dans tl;dr section en haut.Formaté Chaînes
Appeler le
toString
méthode sur l'une de ces trois classes pour générer une Chaîne de caractères représentant la date-valeur du temps dans la norme ISO 8601 format. LeZonedDateTime
classe étend le format standard en ajoutant le nom de l'horaire entre parenthèses.Pour les autres formats utiliser le
DateTimeFormatter
classe. Généralement préférable de laisser cette classe générer localisée en utilisant des formats de l'utilisateur attend le langage humain et les normes culturelles. Ou vous pouvez spécifier un format particulier.Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.Joda-Time
Tout Joda-Time est toujours activement maintenu, ses responsables nous ont dit de migrer vers java.le temps dès qu'il est commode. Je laisse cette section intacte comme une référence, mais je suggère d'utiliser le
java.time
section ci-dessus à la place.Dans Joda-Time, un objet date-heure (
DateTime
) n'a vraiment connaître son fuseau horaire. Que signifie un décalage UTC et les règles et l'histoire de ce fuseau horaire de l'Heure d'été (DST) et d'autres anomalies.Appeler le
toString
méthode pour générer une Chaîne de caractères dans ISO 8601 format.Joda-Time offre également des fonctionnalités riches pour la production de toutes sortes d'autres formats de Chaîne.
Si nécessaire, vous pouvez convertir de Joda-Time DateTime pour java.util.Date.
De recherche StackOverflow pour "joda date" pour trouver de nombreux autres exemples, dont certains sont très détaillés.
†en Fait, il n'y est un fuseau horaire intégré dans java.util.Date, utilisé pour certaines fonctions internes (voir les commentaires sur cette Réponse). Mais ce temps interne de la zone n'est pas exposé comme une propriété, et ne peut pas être définie. Ce temps interne de la zone est pas celui utilisé par le
toString
méthode de production d'une représentation de chaîne de la date-valeur du temps; au lieu de la JVM actuelle du fuseau horaire par défaut est appliqué à la volée. Donc, par commodité, on dit souvent “j.u.La Date n'a pas le temps de la zone”. Confus? Oui. Encore une autre raison d'éviter ces fatigué anciennes classes.BaseCalendar.Date cdate
de la propriété si elle est définie. Regardez le code source ici. Vous ne pouvez pas régler le fuseau horaire de j.u.Objet Date, sauf en changeant le fuseau horaire par défaut de la JVM en appelantTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Ainsi, il y a un décalage horaire et vous pouvez obtenir le décalage par l'appel de la méthode dépréciée j.u.Date.getTimezoneOffset()toString
méthode qui s'applique la JVM par défaut en cours de fuseau horaire; ignorant encore enfouis fuseau horaire. Donc, par souci de concision, nous disons qu'une java.util.La Date n'a pas de temps horaire. Art, c'est un mensonge qui dit la vérité.TimeZone.setDefault
, vous êtes pas réglage de la zone horaire de la java.util.Date objet-l'objet Date ignore encore aujourd'hui ses enterré fuseau horaire, agir efficacement en UTC. Vous aurait une incidence sur la Date detoString
méthode. Le réglage par défaut des changements de la JVM par défaut de temps de la zone qui est généralement le système d'exploitation hôte du fuseau horaire. Que l'appel n'est pas recommandée comme il affecte tout le code dans tous les fils de toutes les applications en cours d'exécution dans la JVM, et ce, à la volée, comme ils sont en cours d'exécution. Être impoli et dangereux, que l'appel ne doit être considérée comme un dernier recours.equals
,hashcode
,getTime
..) Si vous prenez un coup d'oeil à laequals
méthode, il appellegetTime()
qui appellegetTimeImpl()
, qui appellenormalize()
si lecdate
propriété n'est pas normalisée. Dansnormalize()
méthode, la dernière si la condition de re-calcule le nombre de millisecondes depuis le 1/1/70 basé sur sa stockées les informations de fuseau horaire si l'horaire decdate
est différent de l'horaire actuel de la JVM de l'environnement, il est en cours d'exécution sur. (Jetez un oeil àsun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Vous pouvez également définir le fuseau horaire à la JVM niveau
de sortie:
TimeZone.setDefault
est plutôt radicale, car elle affecte l'ensemble de la JVM, affecte tous les autres objets et les threads. Voir cette réponse pour plus de détails, y compris plus de complications, si vous êtes en cours d'exécution avec un SecurityManager. En ajoutant encore plus de complication: Ce comportement a été modifié dans les différentes versions de Java, comme indiqué dans le cette Question.Si vous devez travailler avec uniquement des classes du JDK, vous pouvez utiliser ceci:
De crédit va à ce post.
java.util.Agenda
est la façon habituelle de gérer les fuseaux horaires en utilisant seulement les classes du JDK. Apache Commons a certaines autres solutions de rechange ou des utilitaires qui peuvent vous être utiles. Modifier Spong note m'a rappelé que j'ai entendu de très bonnes choses au sujet de Joda-Time (bien que je n'ai pas utilisé moi-même).Period
,Duration
, etInterval
. Celles qui s'étend sur une comparaison des méthodes telles quecontains
,abuts
,overlap
, etgap
. EtPeriodFormatterBuilder
peut construire des expressions telles que "15 ans et 8 mois".Si jamais quelqu'un a besoin de cela, si vous avez besoin de convertir un
XMLGregorianCalendar
fuseau horaire de votre fuseau horaire UTC, puis tout ce que vous devez faire est de définir le fuseau horaire pour0
, puis d'appelertoGregorianCalendar()
- il rester le même fuseau horaire, mais laDate
sait comment faire pour le convertir à la vôtre, de sorte que vous pouvez obtenir les données à partir de là.Résultat:
Convertir la Date en Chaîne de caractères et de le faire avec SimpleDateFormat.
Ce code a été utile dans une application que je suis en train de travailler sur: