Comment extraire la valeur d'époque vers Long
des instances de LocalDateTime
ou LocalDate
? J'ai essayé ce qui suit, mais cela me donne d'autres résultats:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Ce que je veux, c'est simplement la valeur 1391539861
de la date / heure locale "04.02.2014 19:51:01"
. Mon fuseau horaire est Europe/Oslo
UTC + 1 avec l'heure d'été.
LocalDateTime
autres que de le calculer manuellement?Réponses:
Les classes
LocalDate
etLocalDateTime
ne contiennent pas d'informations sur le fuseau horaire ou le décalage horaire , et les secondes depuis l'époque seraient ambiguës sans ces informations. Cependant, les objets ont plusieurs méthodes pour les convertir en objets date / heure avec des fuseaux horaires en passant uneZoneId
instance.LocalDate
LocalDateTime
la source
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
pour les cas UTC, ou lorsque vous connaissez déjà le fuseau horaire, oulong epoch = time.toEpochSecond(ZoneId.systemDefault());
si vous souhaitez emprunter cette route.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
'Millis since unix epoch' représente un instant, vous devez donc utiliser la classe Instant:
la source
ZoneId.systemDefault()
car l'époque Unix fait référence à UTCLa conversion dont vous avez besoin nécessite le décalage par rapport à UTC / Greewich, ou un fuseau horaire.
Si vous avez un décalage, il y a un méthode dédiée à
LocalDateTime
cette tâche:Si vous n'avez qu'un
ZoneId
vous pouvez l'obtenirZoneOffset
auprès duZoneId
:Mais vous pouvez trouver une conversion
ZonedDateTime
plus simple:la source
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Regardez cette méthode pour voir quels champs sont pris en charge. Vous trouverez pour
LocalDateTime
:Le champ INSTANT_SECONDS n'est bien entendu pas pris en charge car a
LocalDateTime
ne peut faire référence à aucun horodatage absolu (global). Mais ce qui est utile, c'est le champ EPOCH_DAY qui compte les jours écoulés depuis le 1970-01-01. Des pensées similaires sont valables pour le typeLocalDate
(avec encore moins de champs pris en charge).Si vous avez l'intention d'obtenir le champ millis-since-unix-epoch non existant, vous avez également besoin du fuseau horaire pour passer d'un type local à un type global. Cette conversion peut être effectuée beaucoup plus simplement, voir d'autres articles SO .
Pour revenir à votre question et aux chiffres de votre code:
16105L * 86400 + 71461 = 1391543461 secondes depuis le 1970-01-01T00: 00: 00 (attention, pas de fuseau horaire) Ensuite, vous pouvez soustraire le décalage du fuseau horaire (attention à la multiplication possible par 1000 si en millisecondes).
MISE À JOUR après avoir donné les informations de fuseau horaire:
En tant que code JSR-310 avec deux approches équivalentes:
la source
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
et ensuiteLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Conversion de la date lisible par l'homme à l'époque :
Conversion de l' époque en date lisible par l'homme :
Pour un autre convertisseur de langue: https://www.epochconverter.com
la source
C'est une façon sans utiliser le temps un fuseau:
la source