Je me demande s'il y a un moyen de millisecondes en cours depuis 01/01/1970 (époque) en utilisant la nouvelle LocalDate
, LocalTime
ou des LocalDateTime
classes de Java 8.
La voie connue est ci-dessous:
long currentMilliseconds = new Date().getTime();
ou
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
serait sans objet dans ce contexte. Pensez Calendrier + Horloge murale avec une très bonne précision, sans souci de fuseaux horaires et de localité. Il n'y a donc aucun moyen de revenir à "UTC Time" à partir d'un LocalTimeRéponses:
Je ne suis pas tout à fait sûr de ce que vous entendez par "millisecondes actuelles" mais je suppose que c'est le nombre de millisecondes depuis "l'époque", à savoir minuit, le 1er janvier 1970 UTC.
Si vous voulez trouver le nombre de millisecondes depuis l'époque en ce moment, utilisez-le
System.currentTimeMillis()
comme l' a souligné Noub anubien . Si tel est le cas, il n'y a aucune raison d'utiliser l'une des nouvelles API java.time pour ce faire.Cependant, vous possédez peut-être déjà un
LocalDateTime
objet similaire de quelque part et vous souhaitez le convertir en millisecondes depuis l'époque. Il n'est pas possible de le faire directement, car laLocalDateTime
famille d'objets n'a aucune idée de leur fuseau horaire. Ainsi, les informations de fuseau horaire doivent être fournies pour trouver l'heure par rapport à l'époque, qui est en UTC.Supposons que vous en ayez un
LocalDateTime
comme ça:Vous devez appliquer les informations de fuseau horaire, donnant un
ZonedDateTime
. Je suis dans le même fuseau horaire que Los Angeles, donc je ferais quelque chose comme ça:Bien sûr, cela fait des hypothèses sur le fuseau horaire. Et il y a des cas marginaux qui peuvent se produire, par exemple, si l'heure locale arrive à nommer une heure proche de la transition de l'heure d'été (heure d'été). Mettons cela de côté, mais sachez que ces cas existent.
Quoi qu'il en soit, si vous pouvez obtenir un valide
ZonedDateTime
, vous pouvez le convertir en nombre de millisecondes depuis l'époque, comme ceci:la source
getEpochSecond
méthode (par défaut ChronoZonedDateTime ). Pas besoin deInstant
.ZonedDateTime
a égalementInstant
degetNano
la méthode, de sorte que vous ne seriez pas en mesure de remplacer tout simplementinst
aveczdt
votre exemple?Ce que je fais, je ne spécifie pas de fuseau horaire,
donne
Comme vous pouvez le voir, les chiffres sont les mêmes, sauf pour un petit temps d'exécution.
Au cas où vous n'aimeriez pas System.currentTimeMillis, utilisez
Instant.now().toEpochMilli()
la source
Pour éviter ZoneId, vous pouvez faire:
Obtenir 0 comme valeur, c'est vrai!
la source
ZoneOffset.ofTotalSeconds(0)
c'est la même chose queZoneOffset.UTC
ZoneOffset
est une sous-classe deZoneId
, donc je ne dirais pas exactement que vous l'avez évité, mais tant que vous êtes heureux…ZoneId
?Depuis Java 8, vous pouvez appeler
java.time.Instant.toEpochMilli()
.Par exemple l'appel
vous donne les mêmes résultats que
la source
Vous pouvez
java.sql.Timestamp
également utiliser pour obtenir des millisecondes.la source
Timestamp
classe est dépassée depuis longtemps et remplie de problèmes de conception, je préfère donc l'éviter, surtout lorsque nous pouvons utiliser les classes de lajava.time
même manièreLocalDateTime
.Timestamp
, pouvez-vous partager un article à ce sujet? Cela m'aide également à éviter d'utiliserTimestamp
mon code. Merci!Date
mais ne peut souvent pas être traité comme unDate
. La plupart des méthodes héritées deDate
et un constructeur sont obsolètes. SatoString
méthode utilise le fuseau horaire de la JVM, ce qui en déroute beaucoup car le mêmeTimestamp
est imprimé différemment sur différents ordinateurs ( exemple ).LocalDate.of(year, month, day)
Pour obtenir l'heure actuelle en millisecondes (depuis l'époque), utilisez
System.currentTimeMillis()
.la source
Si vous avez une horloge Java 8, vous pouvez l'utiliser
clock.millis()
(bien qu'il vous recommande d'utiliserclock.instant()
pour obtenir un instantané Java 8, car il est plus précis).Pourquoi utiliseriez-vous une horloge Java 8? Donc, dans votre framework DI, vous pouvez créer un bean Clock:
puis dans vos tests, vous pouvez facilement vous moquer de lui:
ou vous pouvez avoir un bean différent:
ce qui aide à des tests qui affirment des dates et des heures incommensurablement.
la source
la source
Pourquoi personne n'a mentionné la méthode
LocalDateTime.toEpochSecond()
:Cela semble beaucoup plus court que beaucoup de réponses suggérées ci-dessus ...
la source
toEpochMilli
méthode, compte tenu du fait que vous pouvez spécifier même des nanosecondes dans LocalDateTime: il y a une méthodeLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.