Comment puis-je retourner LocalDate.maintenant() en millisecondes?
Je crée date:
ZoneId gmt = ZoneId.of("GMT");
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDateNow = localDateTime.toLocalDate();
Alors je veux le retour de cette date en millisecondes:
localDateNow.atStartOfDay(gmt) - 22.08.2017
localDateNow.atStartOfDay(gmt).toEpochSecond(); - 1503360000 (18.01.70)
Comment puis-je retourner LocalDate.now()
en millisecondes?
Comment peut-on un jour ont millisecondes? Millisecondes est une partie de l'horodatage pas de la date
localDateTime.atZone(gmt).toEpochSecond() retour 1503403331 (18.01.70)
De quoi vous parlez
Instand aof appel toEpochSecond(), appelez toInstant().toEpochMilli()
Nizet Merci! exactement ce qui est nécessaire!
localDateTime.atZone(gmt).toEpochSecond() retour 1503403331 (18.01.70)
De quoi vous parlez
LocalDate
ou LocalDateTime
? Vous vous demandez pour LocalDate et de donner l'exemple pour LocalDateTime
.Instand aof appel toEpochSecond(), appelez toInstant().toEpochMilli()
Nizet Merci! exactement ce qui est nécessaire!
OriginalL'auteur user5620472 | 2017-08-22
Vous devez vous connecter pour publier un commentaire.
Appel
toInstant().toEpochMilli()
, comme suggéré par @JB Nizet commentaire, c'est la bonne réponse, mais il y a un peu délicat de détails sur l'utilisation locale dates que vous devez être conscient de.Mais avant cela, quelques autres détails mineurs:
ZoneId.of("GMT")
vous pouvez utiliser la constante intégréeZoneOffset.UTC
. Elles sont équivalentes, mais il n'y a pas besoin de créer d'autres objets redondants si l'API fournit déjà un qui fait exactement la même chose.LocalDateTime.now()
et puis.toLocalDate()
, vous pouvez appelerLocalDate.now()
directement - elles sont équivalentes.Maintenant la délicate détails: lorsque vous appelez la
now()
méthode (pour lesLocalDateTime
ouLocalDate
), il utilise la JVM du fuseau horaire par défaut pour obtenir les valeurs de la date actuelle, et cette valeur peut être différente selon le fuseau horaire configuré dans la JVM.Dans la JVM, je suis en utilisant, le fuseau horaire par défaut est
America/Sao_Paulo
, et l'heure locale est ici 09:37 AM. DoncLocalDate.now()
retourne2017-08-22
(août 22ème 2017).Mais si je change le fuseau horaire par défaut pour
Pacific/Kiritimati
, il retourne2017-08-23
. C'est parce que dans Kiritimati, droit maintenant, c'est déjà août 23ème 2017 (et l'heure locale là, au moment où j'écris ceci, est 02:37 AM).Donc, si j'exécute ce code lorsque le fuseau horaire par défaut est
Pacific/Kiritimati
:La sortie est:
Qui est l'équivalent d'août 23ème 2017 à minuit UTC.
Si j'exécute le même code lorsque le fuseau horaire par défaut est
America/Sao_Paulo
, le résultat sera:Qui est l'équivalent d'août 22ème 2017 à minuit UTC.
À l'aide de
now()
rend votre code dépend de la JVM du fuseau horaire par défaut. Et cette configuration peut être modifié sans préavis, même au moment de l'exécution, ce qui rend votre code de retour des résultats différents lors d'un tel changement se produit.Et vous n'avez pas besoin d'un tel cas extrême (comme quelqu'un misconfiguring la JVM d'un "très-bien" fuseau horaire). Dans mon cas, par exemple, dans
America/Sao_Paulo
fuseau horaire, si j'exécute le code à 11 H,LocalDate
sera de retour en août 22ème, mais la date actuelle au format UTC sera déjà août 23ème. C'est parce que de 11 H à São Paulo est la même que 2 SUIS de la lendemain en UTC:Donc à l'aide d'un
LocalDate.now()
est pas une garantie que je vais toujours avoir la date actuelle au format UTC.Si vous voulez le date actuelle au format UTC (quelle que soit la JVM fuseau horaire par défaut) et réglez l'heure à minuit, il est préférable d'utiliser une
ZonedDateTime
:La sortie est:
Qui est l'équivalent d'août 22ème 2017 à minuit UTC.
Une autre alternative est de passer le fuseau horaire pour
LocalDate.now
, de sorte qu'il peut obtenir les valeurs correctes pour la date du jour sur la zone spécifiée:OriginalL'auteur