Java 8 a ajouté une nouvelle API java.time pour travailler avec les dates et les heures ( JSR 310 ).
J'ai la date et l'heure sous forme de chaîne (par exemple "2014-04-08 12:30"
). Comment puis-je obtenir une LocalDateTime
instance de la chaîne donnée?
Après avoir fini de travailler avec l' LocalDateTime
objet: comment puis-je reconvertir l' LocalDateTime
instance en une chaîne au même format que celui illustré ci-dessus?
ZonedDateTime
plutôt qu'unLocalDateTime
. Le nom est contre-intuitif; lesLocal
moyens toute localité en général plutôt qu'une zone de temps spécifique. En tant que tel, unLocalDateTime
objet n'est pas lié à la chronologie. Pour avoir un sens, pour obtenir un moment précis sur la ligne de temps, vous devez appliquer un fuseau horaire.LocalDateTime
vs vsZonedDateTime
vsOffsetDateTime
vsInstant
vsLocalDate
vsLocalTime
, comment garder son calme sur pourquoi c'est si compliqué et comment le faire dès le premier coup.LocalDateTime
aurait probablement été nomméZonelessOffsetlessDateTime
.Réponses:
Analyser la date et l'heure
Pour créer un
LocalDateTime
objet à partir d'une chaîne, vous pouvez utiliser laLocalDateTime.parse()
méthode statique . Il prend une chaîne et unDateTimeFormatter
paramètre as. LeDateTimeFormatter
est utilisé pour spécifier le modèle de date / heure.Formatage de la date et de l'heure
Pour créer une chaîne formatée sur un
LocalDateTime
objet, vous pouvez utiliser laformat()
méthode.Notez qu'il existe des formats de date / heure couramment utilisés prédéfinis en tant que constantes dans
DateTimeFormatter
. Par exemple: utiliserDateTimeFormatter.ISO_DATE_TIME
pour formater l'LocalDateTime
instance ci-dessus entraînerait la chaîne"1986-04-08T12:30:00"
.Les méthodes
parse()
etformat()
sont disponibles pour tous les objets liés à la date / heure (par exempleLocalDate
ouZonedDateTime
)la source
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
format()
la classe LocalDateTime au lieu de l'instance? Du moins, c'est ce que j'ai fait: je me suis confonduDateTime
avecdateTime
dans l'exemple ci-dessus.Vous pouvez également utiliser
LocalDate.parse()
ouLocalDateTime.parse()
sur unString
sans lui fournir un motif, si le formatString
est au format ISO-8601 .par exemple,
Sortie ,
et à utiliser
DateTimeFormatter
uniquement si vous devez gérer d'autres modèles de date.Par exemple, dans l'exemple suivant, jj MMM uuuu représente le jour du mois (deux chiffres), trois lettres du nom du mois (janvier, février, mars, ...) et une année à quatre chiffres:
Production
rappelez-vous également que l'
DateTimeFormatter
objet est bidirectionnel; il peut à la fois analyser l'entrée et formater la sortie.Production
(voir la liste complète des modèles de formatage et d'analyse de DateFormatter )
la source
2018-08-09 12:00:08
mais quand j'analyse, je vois unT
ajout dont je n'ai pas besoin. Y a-t-il un moyen de le faire?yyyy-MM-dd hh:mm:ss
pour l'analyse et le formatage. Le T s'affichera toujours au format par défaut (ISO-8061), mais vous pouvez utiliser vos propres motifs.Les deux réponses ci-dessus expliquent très bien la question concernant les modèles de chaînes. Cependant, juste au cas où vous travaillez avec ISO 8601, il n'est pas nécessaire de l'appliquer
DateTimeFormatter
car LocalDateTime est déjà préparé pour cela:Convertir LocalDateTime en chaîne de fuseau horaire ISO8601
Convertir de la chaîne ISO8601 en un LocalDateTime
la source
Analyser une chaîne avec la date et l'heure dans un moment particulier (Java l'appelle un "
Instant
") est assez compliqué. Java a résolu ce problème en plusieurs itérations. Le dernier,java.time
etjava.time.chrono
, couvre presque tous les besoins (sauf Time Dilation :)).Cependant, cette complexité apporte beaucoup de confusion.
La clé pour comprendre l'analyse de date est:
Pourquoi Java a-t-il tant de façons d'analyser une date
... et pourquoi le
LocalDateTime
,ZonedDateTime
et al. si compliquéIl y a fuseaux horaires . Un fuseau horaire est fondamentalement une "bande" * [1] de la surface de la Terre dont les autorités suivent les mêmes règles de quand a-t-elle quel décalage horaire. Cela inclut les règles de l'heure d'été.
Les fuseaux horaires changent au fil du temps pour divers domaines, principalement en fonction de qui conquiert qui. Et les règles d'un fuseau horaire changent également au fil du temps .
Il y a des décalages horaires. Ce n'est pas la même chose que les fuseaux horaires, car un fuseau horaire peut être par exemple "Prague", mais qui a un décalage d'heure d'été et un décalage d'heure d'hiver.
Si vous obtenez un horodatage avec un fuseau horaire, le décalage peut varier, selon la partie de l'année dans laquelle il se trouve. Pendant l'heure bissextile, l'horodatage peut signifier 2 heures différentes, donc sans informations supplémentaires, il ne peut pas être fiable converti.
Remarque: Par horodatage, je veux dire "une chaîne qui contient une date et / ou une heure, éventuellement avec un fuseau horaire et / ou un décalage horaire".
Plusieurs fuseaux horaires peuvent partager le même décalage horaire pour certaines périodes. Par exemple, le fuseau horaire GMT / UTC est le même que le fuseau horaire "Londres" lorsque le décalage horaire d'été n'est pas en vigueur.
Pour le rendre un peu plus compliqué (mais ce n'est pas trop important pour votre cas d'utilisation):
2040-12-31 24:00:00
peut s'agir d'une date-heure valide.) Cela nécessite des mises à jour régulières des métadonnées que les systèmes utilisent pour que les conversions de date soient correctes. Par exemple, sous Linux, vous obtenez des mises à jour régulières des packages Java, y compris ces nouvelles données.Les mises à jour ne conservent pas toujours le comportement précédent pour les horodatages historiques et futurs. Il peut donc arriver que l'analyse des deux horodatages autour d'un changement de fuseau horaire les compare puisse donner des résultats différents lors de l'exécution sur différentes versions du logiciel. Cela s'applique également à la comparaison entre le fuseau horaire affecté et un autre fuseau horaire.
Si cela provoque un bogue dans votre logiciel, envisagez d'utiliser un horodatage qui n'a pas de règles aussi compliquées, comme l' horodatage UNIX .
À cause de 7, pour les dates futures, nous ne pouvons pas convertir les dates exactement avec certitude. Ainsi, par exemple, l'analyse actuelle de
8524-02-17 12:00:00
peut être désactivée à quelques secondes de l'analyse future.Les API de JDK pour cela ont évolué avec les besoins contemporains
java.util.Date
une approche un peu naïve, en supposant qu'il n'y avait que l'année, le mois, le jour et l'heure. Cela n'a pas suffi rapidement.java.sql.Date
été introduit, avec ses propres limites.Calendar
API a été introduite.Comment y faire face dans Java
java.time
Déterminer à quel type analyser un horodatage
Lorsque vous consommez une chaîne d'horodatage, vous devez savoir quelles informations elle contient. C'est le point crucial. Si vous n'obtenez pas ce droit, vous vous retrouvez avec des exceptions cryptiques comme "Impossible de créer instantanément" ou "Décalage de zone manquant" ou "ID de zone inconnue" etc.
Contient-il la date et l'heure?
At-il un décalage horaire?
Un décalage horaire est la
+hh:mm
pièce. Parfois, il+00:00
peut être remplacé parZ
le «temps zoulou»,UTC
le temps universel coordonné ouGMT
le temps moyen de Greenwich. Celles-ci définissent également le fuseau horaire.Pour ces horodatages, vous utilisez
OffsetDateTime
.At-il un fuseau horaire?
Pour ces horodatages, vous utilisez
ZonedDateTime
.La zone est spécifiée soit par
La liste des fuseaux horaires est compilée par une "base de données TZ" , soutenue par l'ICAAN.
Selon
ZoneId
javadoc, les identifiants de zone peuvent également être spécifiés en quelque sorteZ
et offset. Je ne sais pas comment cela correspond aux zones réelles. Si l'horodatage, qui n'a qu'un TZ, tombe dans une heure bissextile de décalage horaire, alors il est ambigu et l'interprétation est sujetteResolverStyle
, voir ci-dessous.S'il n'a ni l'un ni l'autre , alors le contexte manquant est supposé ou négligé. Et le consommateur doit décider. Il doit donc être analysé
LocalDateTime
et converti enOffsetDateTime
en ajoutant les informations manquantes:Duration
), ou lorsque vous ne savez pas et que cela n'a pas vraiment d'importance (par exemple, les horaires des bus locaux).Informations sur le temps partiel
LocalDate
,LocalTime
,OffsetTime
,MonthDay
,Year
ouYearMonth
hors de celui - ci.Si vous avez les informations complètes, vous pouvez obtenir un
java.time.Instant
. Ceci est également utilisé en interne pour convertir entreOffsetDateTime
etZonedDateTime
.Découvrez comment l'analyser
Il existe une documentation complète sur
DateTimeFormatter
laquelle peut à la fois analyser une chaîne d'horodatage et formater en chaîne.Les créé pré-
DateTimeFormatter
s devraient couvrir plusmoins tous les formats d'horodatage standard. Par exemple,ISO_INSTANT
peut analyser2011-12-03T10:15:30.123457Z
.Si vous avez un format spécial, vous pouvez créer votre propre DateTimeFormatter (qui est également un analyseur).
Je vous recommande de regarder le code source de
DateTimeFormatter
et de vous inspirer sur la façon d'en créer un en utilisantDateTimeFormatterBuilder
. Pendant que vous y êtes, regardez égalementResolverStyle
qui contrôle si l'analyseur est LENIENT, SMART ou STRICT pour les formats et les informations ambiguës.TemporalAccessor
Maintenant, l'erreur fréquente est d'entrer dans la complexité de
TemporalAccessor
. Cela vient de la façon dont les développeurs étaient habitués à travaillerSimpleDateFormatter.parse(String)
. D'accord,DateTimeFormatter.parse("...")
vous donneTemporalAccessor
.Mais, équipé des connaissances de la section précédente, vous pouvez facilement analyser le type dont vous avez besoin:
Vous n'avez en fait pas besoin
DateTimeFormatter
non plus. Les types que vous souhaitez analyser ont lesparse(String)
méthodes.En ce qui concerne
TemporalAccessor
, vous pouvez l'utiliser si vous avez une vague idée des informations contenues dans la chaîne et souhaitez décider au moment de l'exécution.J'espère avoir jeté une lumière de compréhension sur votre âme :)
Remarque: il existe un backport de
java.time
Java 6 et 7: ThreeTen-Backport . Pour Android, il a ThreeTenABP .[1] Non seulement ce ne sont pas des rayures, mais il y a aussi des extrêmes étranges. Par exemple, certaines îles voisines du Pacifique ont des fuseaux horaires +14: 00 et -11: 00. Cela signifie que si sur une île, il y a le 1er mai 15h, sur une autre île pas si loin, c'est toujours le 30 avril 12h (si j'ai bien compté :))
la source
OBTENEZ LE TEMPS UTC ACTUEL DANS LE FORMAT REQUIS
la source
J'ai trouvé cela merveilleux de couvrir plusieurs variantes de format de date et heure comme ceci:
la source