Comment convertir le de org.joda.temps.DateTime pour java.temps.ZonedDateTime
J'ai une source de données avec joda time DateTime objets stockés. J'ai besoin de les convertir en java ZonedDateTime objets, en gardant l'original fuseau horaire.
Elle n'est pas suffisante pour maintenir le décalage depuis quelques objets DateTime représente quotidienne des tâches répétitives, et ces tâches doivent être exécutées à un moment précis dans un fuseau horaire spécifique pour chaque date. Ils doivent donc suivre le Fuseau horaire spécifié transitions par exemple été et en hiver. Je ne peux pas dire l'utilisation finale de l'DateTime objets, donc j'ai besoin de garder les informations de fuseau Horaire sur tous les objets pour être sûr.
Comment convertir le de org.joda.temps.DateTime pour java.temps.ZonedDateTime?
Sera tous
ord.joda.temps.DateTimeZone.getId()
carte à l'id est disponible en
java.temps.ZoneId
OriginalL'auteur Andreas Lundgren | 2015-03-05
Vous devez vous connecter pour publier un commentaire.
Pas tout le temps la zone des chaînes de Joda-Temps du match
java.time
mais la grande majorité comme ils sont tous deux basés sur l'IANA tz données. ComparerDateTimeZone.getAvailableIDs()
àZoneId.getAvailableZoneIds()
pour déterminer le décalage. Les identificateurs supplémentaires peuvent être cartographiés à l'aide deZoneId.de(String, Carte)
.De faire les principaux de conversion dans la manière la plus efficace, vous devez passer dans chaque domaine:
Notez l'utilisation de
ZoneId.SHORT_IDS
comme leMap
dans ce cas.Pour une solution plus simple qui gère la plupart des cas d'utilisation, mais à plus faible rendement, utilisez ceci:
Area/Locality
style de zones seront disponibles dans les deux.La seule différence est ROC, qui a été remplacé par la république de CORÉE. L'est, la TVH et la MST zones peut être consulté à l'aide de
ZoneId.SHORT_IDS
. Sinon, toutes les différences sont seulement à partir de la version ultérieure du temps de la zone de base de données dans Joda-Time.Au lieu de
ZoneId.of(dt.getZone().getID(), ZoneId.SHORT_IDS))
ne serait pasdt.toTimeZone().toZoneId()
? il semble laisser le nitty gritty de JodaTime et Java, respectivement.Oui ça devrait fonctionner aussi.
Cela ne peut pas fonctionner correctement autour de modifications d'heure d'été (
(year, month, day, hour, minute, second, millis, zone)
n'est pas de définir un point dans le temps). @MuhipTezcan réponse semble pour obtenir ce droit.OriginalL'auteur JodaStephen
Vous devriez éviter de fournir à chaque domaine séparément si vous travaillez avec l'heure d'été à des transitions. Convertir à l'aide de epochMillis au lieu de cela, comme dans l'exemple suivant.
Sinon vous allez perdre une heure à la date de transition. Par exemple, en Allemagne, la transition de l'heure d'été (GMT+2) à l'heure d'hiver (GMT+1) sur 29.10.2017 à 03:00 GMT+2, qui devient à 02:00 GMT+1. Ce jour-là, vous avez 2 instances de 02:00 - une précédente avec GMT+2 et plus tard avec l'heure GMT+1.
Puisque vous travaillez avec ZoneIds et pas avec des décalages, il n'y a aucun moyen de savoir lequel des 2 instances que vous voulez. Par défaut, seule la première est prise en compte lors de la conversion. Deux 02:00 GMT+2 et 02:00 GMT+1 vont être convertis à 02:00 GMT+2 si vous fournissez
hourOfDay
avec ZoneId.dt.getZone().getID()
est la bonne méthode.merci, j'ai corrigé la faute de frappe.
Ce doit être la accepté de répondre, c'est le plus précis actuellement accepté de répondre, et probablement beaucoup plus efficace aussi. Votre dernière ligne équivalent à
instant.atZone(zoneId)
?OriginalL'auteur Muhip Tezcan