Convertir java.util.La Date de ce “java.temps” type?
J'ai un java.util.Date
objet, ou un java.util.Calendar
objet. Comment puis-je convertir que pour le bon type de java.le temps cadre?
J'ai entendu dire que l'on doit maintenant faire l'essentiel de notre logique d'entreprise avec java.les types d'heures. Lorsque vous travaillez avec de l'ancien code pas encore mis à jour pour java.temps j'ai besoin d'être en mesure de convertir en arrière et en avant. Quels sont les types de carte à java.util.Date
ou java.util.Calendar
?
- Merci de me le demander (et pour répondre)! Pourquoi ne pas utiliser JodaTime BTW?
- JodaTime était nécessaire avant de Java 8 nouvelle API (qui a été beaucoup influencé par JodaTime je crois, peut-être même par les mêmes personnes). Ce n'est pas plus utile.
- La java.cadre de temps est la langue officielle de remplacement pour Joda-Time. Les deux projets sont dirigés par le même homme, Stephen Colebourne (“jodastephen”).
Vous devez vous connecter pour publier un commentaire.
Oui, vous avez certainement devraient être à l'aide de la java.le temps cadre à chaque fois que possible.
Éviter de vieille date-heure classes
La vieille date-heure les classes, y compris
java.util.Date
,java.util.Agenda
, etjava.text.SimpleTextFormat
et ont prouvé pour être mal conçu, confus et ennuyeux. Éviter d'eux quand vous le pouvez. Mais quand vous devez interagir avec ces vieux types, vous pouvez convertir entre les anciens et les nouveaux.Lire la suite pour une introduction de base, un peu trop simplifiée, pour vous orienter dans le mouvement de va-et-vient entre l'ancienne et la nouvelle date-heure classes.
java.temps
La java.le temps cadre est défini par JSR 310, inspiré par le très populaire Joda-Time bibliothèque, et prolongée par le ThreeTen-Extra projet. La majeure partie des fonctionnalités de back-porté à Java 6 & 7 dans les ThreeTen-Backport projet, avec une poursuite de l'adaptation pour Android dans le ThreeTenABP projet.
Ce que java.temps type correspond
java.util.Date
? Eh bien, unjava.util.Date
objet représente essentiellement un moment sur la ligne de temps en temps UTC, une combinaison d'une date et d'une heure de la journée. Nous pouvons traduire cela à l'un de plusieurs types en java.temps. Chacun est discuté ci-dessous. Notez que certains de nouvelles méthodes ont été ajoutées à l'ancienne date-classes de temps pour faciliter les conversions.Instant
Le bloc de construction en java.le temps est un
Instantané
, un moment dans le scénario de UTC avec une résolution de nanosecondes.Généralement, vous devriez faire beaucoup de logique d'entreprise de l'UTC. Dans ce travail,
Instant
seront utilisés fréquemment. Passer autour deInstant
objets, l'application d'un fuseau horaire que pour la présentation à un utilisateur. Lorsque vous ne besoin d'appliquer un décalage de temps ou de zone, utilisez les types de couverts supplémentaires ci-dessous.De
java.util.Date
àInstant
Donné que les deux
Instant
etjava.util.Date
sont un moment sur la ligne de temps en temps UTC, on peut facilement se déplacer d'unjava.util.Date
à unInstant
. La vieille classe a acquis une nouvelle méthode,java.util.Date: toInstant
.Vous pouvez aller dans l'autre sens, à partir d'un
Instant
à unjava.util.Date
. Mais vous risquez de perdre des informations sur les fractions de seconde. UnInstant
pistes nanosecondes, pour jusqu'à neuf chiffres après la virgule comme2016-01-23T12:34:56.123456789Z
. Les deux java.util.Date & .De calendrier sont limitées à millisecondes, pour un maximum de trois chiffres après la virgule comme2016-01-23T12:34:56.123Z
. Dans cet exemple va deInstant
àDate
signifie la troncature de la456789
.De
java.util.Calendar
àInstant
À propos d'une
java.util.Agenda
au lieu d'unjava.util.Date
? Interne à laCalendar
objet de la date-heure est suivi par un chef de millisecondes de la l'époque de référence date-heure le premier instant de 1970 UTC (1970-01-01T00:00:00.0Z
). Donc, cette valeur peut être convertie facilement à unInstant
.De
java.util.GregorianCalendar
àZonedDateTime
Encore mieux, si votre
java.util.Agenda
objet est en fait unjava.util.GregorianCalendar
vous pouvez facilement accéder directement à uneZonedDateTime
. Cette approche a l'avantage de conserver l'embedded informations de fuseau horaire.Abattu de la interface de
Calendar
à la la classe de béton deGregorianCalendar
. Ensuite, appelez letoZonedDateTime
etde
méthodes pour faire l'aller-retour.Va l'autre sens...
Comme discuté ci-dessus, méfiez-vous que vous pouvez être de perdre de l'information sur la fraction de seconde. Le nanosecondes dans le java.type de temps (
ZonedDateTime
) obtient tronqué à millisecondes dans le.Calendar
/.GregorianCalendar
.OffsetDateTime
À partir d'un
Instant
nous pouvons appliquer une offset-de-UTC de se déplacer dans un horloge murale pour une localité. Un décalage est un certain nombre d'heures, et, éventuellement, des minutes et des secondes, avant de UTC (vers l'est) ou derrière UTC (vers l'ouest). LeÉcartfuseau
classe représente cette idée. Le résultat est unOffsetDateTime
objet.Vous pouvez aller dans l'autre sens, à partir d'un
OffsetDateTime
à unjava.util.Date
. Extrait d'unInstant
puis procéder comme nous l'avons vu dans le code ci-dessus. Comme discuté ci-dessus, toute nanosecondes obtenir tronqué à millisecondes (la perte de données).ZonedDateTime
Mieux encore, appliquez une fuseau horaire. Un fuseau horaire est une déviation plus règles de traitement des anomalies telles que des Heure d'été (DST).
L'application d'un
ZoneId
vous obtient unZonedDateTime
objet. Utiliser un fuseau horaire nom (continent/région). Ne jamais utiliser de l'3-4 lettre abréviations communément vu commeEST
ouIST
comme ils ne sont ni standardisés ni unique.Vous pouvez aller dans l'autre sens, à partir d'un
ZonedDateTime
à unjava.util.Date
. Extrait d'unInstant
puis procéder comme nous l'avons vu dans le code ci-dessus. Comme discuté ci-dessus, toute nanosecondes obtenir tronqué à millisecondes (la perte de données).Et nous avons vu plus haut qu'une
ZonedDateTime
peut être converti en unGregorianCalendar
.LocalDate
Parfois, vous voudrez peut-être un jour-seulement de la valeur, sans le temps de la journée et sans fuseau horaire. Pour cela, utiliser un
java.temps.LocalDate
objet.Voir cette Question pour plus de discussion, Convertir java.util.Date de java.temps.LocalDate, en particulier cette Réponse écrit par le principal de l'homme à l'origine de l'invention de deux Joda-Time et java.temps.
La clé est de passer par un
ZonedDateTime
(comme généré dans le code ci-dessus). Nous avons besoin d'un fuseau horaire à déterminer une date. La date varie à travers le monde, avec un nouveau jour se lève plus tôt dans l'est. Par exemple, après minuit à Paris est un nouveau jour, alors encore “hier” à Montréal. Ainsi pendant qu'unLocalDate
ne pas contenir un fuseau horaire, fuseau horaire est nécessaire pour déterminer unLocalDate
.De la conversion dans l'autre sens de
LocalDate
à une date-heure signifie inventer une heure de la journée. Vous pouvez choisir n'importe quelle heure de la journée qui fait sens dans votre scénario d'entreprise. Pour la plupart des gens, le premier moment de la journée, fait sens. Vous pourriez être tenté de coder en dur à ce moment que le temps00:00:00.0
. Dans certaines zones de temps, que le temps ne peut être valide que le premier moment en raison de la Heure d'été (DST) ou d'autres anomalies. Alors laissez-java.le temps de déterminer le bon moment avec un appel àatStartOfDay
.LocalTime
À de rares occasion vous pouvez seulement une heure de la journée sans date et sans un fuseau horaire. Ce concept est représenté par la
LocalTime
classe. Comme discuté ci-dessus avecLocalDate
, nous avons besoin d'un fuseau horaire à déterminer unLocalTime
même si leLocalTime
objet ne contient pas de (ne pas "se souvenir") que de fuseau horaire. Donc, encore une fois, nous traversons unZonedDateTime
objet obtenu à partir d'unInstant
comme vu ci-dessus.LocalDateTime
Comme les deux autres
Local…
types, unLocalDateTime
n'a pas d'horaire ni de décalage attribué. En tant que tel vous pouvez utilisez rarement cette. Il vous donne une idée d'une date-temps, mais c'est pas un point sur la timeline. Utilisez cette option si vous voulez dire des généraux de la date et du temps qui pourrait être appliqué à un fuseau horaire.Par exemple, “Noël commence cette année” serait
2016-12-25T00:00:00.0
. Note de l'absence de tout décalage ou de fuseau horaire dans cette représentation textuelle d'unLocalDateTime
. Noël commence tôt à new Delhi en Inde que dans Paris, France, et plus tard encore, à Montréal, Québec, Canada. L'application de chacun de ces domaines fuseau horaire aboutirait à un moment différent sur la timeline.Date
cartes àInstant
, mais je pense queCalendar
avec plus de précision des cartes àZonedDateTime
(si vous êtes heureux d'assumer un calendrier Grégorien) ouChronoZonedDateTime
si vous voulez soutenir arbitraire systèmes de calendrier.java.sql
types ici, comme je l'ai fait il y a (à dessein). Je vous l'accorde, une grande partie de ce matériel a été écrit par moi et d'autres dans les différentes pièces dans des endroits différents. Mais au moment où j'ai été inspiré pour écrire un aperçu général de la façon de convertir des va-et-vient entre les anciens types et java.temps.java.util.Date
est obsolète. Il suffit de regarder combien d'utilisateurs sur un Débordement de Pile sont confus parDate.toString()
montrant la valeur dans le système de l'heure locale de la zone, et à formuler des hypothèses quiDate
a des informations sur un fuseau horaire. Il suffit de regarder la relation d'héritage entrejava.sql.Date
etjava.util.Date
, oùjava.sql.Date
est censé représentent simplement une date, mais n'a même pas de spécifier votre fuseau horaire, c'est soi-disant dans la, quandjava.util.Date
est un point dans le temps. Je pourrais coup de gueule pour les heures à propos de ce...Instant instant = myUtilCalendar.toInstant();
Calendar
: toInstant(): docs.oracle.com/javase/8/docs/api/java/util/... .GregorianCalendar
a deux nouvelles méthodes: toZonedDateTime() et de(ZonedDateTime).Calendar
. Incorporé dans le texte et diagramme.