1
votes

Comment obtenir la date actuelle dans la zone UTC en tant que valeur longue dans Java 8

Comment réaliser ce qui suit dans l'API java 8 date time

ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneOffset.UTC);
System.out.println(zonedDateTime.toEpochSecond());

Le code ci-dessus est retourné

1573171200000

J'ai essayé de suivre

long currentDate = Date.UTC(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
System.out.println(currentDate);

retourné

1573212520


1 commentaires

Comment définissez-vous une «valeur longue»? Est-ce le nombre de millisecondes depuis le 1970-01-01T00Z? Veuillez préciser. Quel est le problème avec votre deuxième résultat, qui est également une «valeur longue» (en secondes au lieu de millisecondes)?


3 Réponses :


3
votes

Obtenez le LocalDate d'aujourd'hui, convertissez-le en ZonedDateTime au début de la journée, puis convertissez-le en Instant et obtenez l'époque millis:

LocalDate.now().atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli()


4 commentaires

Ou utilisez un instant en premier lieu, Instant.now (). TruncatedTo (ChronoUnit.DAYS) .toEpochMilli ()


Vous devriez probablement aussi vouloir LocalDate.now (ZoneOffset.UTC) . Non seulement parce que vous voulez la date UTC, mais aussi pour indiquer clairement au lecteur la date du fuseau horaire que vous obtenez.


@Holger C'est aussi une option. Personnellement, je trouve la version dans la réponse plus facile à lire, mais c'est une question de goût, alors merci de donner au questionneur et à tout le monde une deuxième option à choisir.


@ OleV.V. pour moi, il ne semble pas naturel d'utiliser des solutions qui supportent des conversions entre différentes choses, alors qu'il existe une alternative qui peut fonctionner avec la chose prévue en premier lieu.



3
votes

En fait, les deux résultats sont corrects, il suffit de mal comprendre ce qui se passe:

Dans la première instruction où vous utilisez Date, vous définissez heure, min, sec comme 0 .

Au lieu de ZoneDateTime , vous utilisez now () qui vous donnera la date et l'heure actuelle

Pour obtenir la même temps, je suppose que vous avez besoin de:

1573171200000
1573171200000

Maintenant, les deux approches retournent:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.now(),
        LocalTime.of(0,0,0), 
        ZoneOffset.UTC);
 Long zdtm = zonedDateTime.toInstant().toEpochMilli();

Démo Ideone


1 commentaires

long result = Instant.now (). truncatedTo (ChronoUnit.DAYS) .toEpochMilli ();



0
votes

Si vous n'avez pas besoin de ZonedDateTime, utilisez simplement

System.out.println(Instant.now().toEpochMilli());

Edit: j'ai mal compris que vous avez besoin de millies dès le début de la journée. La réponse de YCF_L avec l'ajout de Holger est correcte.

Cordialement


0 commentaires