Je me demande s’il existe un moyen d’obtenir les millisecondes actuelles depuis le 1-1-1970 (Epoch) en utilisant les nouvelles LocalDate
, LocalTime
ou LocalDateTime
classes de Java 8.
La manière connue est ci-dessous:
long currentMilliseconds = new Date().getTime();
ou
long currentMilliseconds = System.currentTimeMillis();
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 System.currentTimeMillis()
as Anubian Noob a fait remarquer . Si tel est le cas, il n'y a aucune raison d'utiliser l'une des nouvelles API Java.time pour le faire.
Cependant, vous avez peut-être déjà un objet LocalDateTime
ou similaire de quelque part et vous souhaitez le convertir en millisecondes depuis l'époque. Ce n’est pas possible de le faire directement, car la famille d’objets LocalDateTime
n’a aucune idée du fuseau horaire dans lequel ils se trouvent. Il faut donc fournir des informations sur le fuseau horaire pour trouver l’heure relative à l’époque, qui est en UTC.
Supposons que vous ayez un LocalDateTime
comme ceci:
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
Vous devez appliquer les informations de fuseau horaire en donnant un ZonedDateTime
. Je suis dans le même fuseau horaire que Los Angeles, alors je ferais quelque chose comme ceci:
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));
Bien entendu, cela suppose des hypothèses sur le fuseau horaire. Et il peut arriver que des cas se produisent, par exemple, s'il est l'heure locale de nommer une heure proche de la transition de l'heure d'été (heure d'été). Laissons ces choses de côté, mais sachez que ces cas existent.
Quoi qu'il en soit, si vous pouvez obtenir un ZonedDateTime
valide, vous pouvez le convertir en nombre de millisecondes depuis l'époque, comme suit:
long millis = zdt.toInstant().toEpochMilli();
Ce que je fais pour que je ne spécifie pas de fuseau horaire,
System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());
donne
ldt 1424812121078
ctm 1424812121281
Juste au cas où vous n'aimeriez pas System.current ...., utilisez Instant.now().toEpochMilli()
Pour éviter ZoneId, vous pouvez faire:
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);
System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());
Obtenir 0 comme valeur, c'est vrai!
Depuis Java 8, vous pouvez appeler Java.time.Instant.toEpochMilli()
.
Par exemple l'appel
final long currentTimeJava8 = Instant.now().toEpochMilli();
vous donne les mêmes résultats que
final long currentTimeJava1 = System.currentTimeMillis();
Vous pouvez utiliser Java.sql.Timestamp
également pour obtenir des millisecondes.
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
Pour obtenir l'heure actuelle en millisecondes (depuis l'époque), utilisez System.currentTimeMillis()
.
Si vous avez une horloge Java 8, vous pouvez utiliser clock.millis()
(bien qu'il vous recommande d'utiliser clock.instant()
pour obtenir un Java 8 Instant, car il s'agit davantage précis).
Pourquoi utiliseriez-vous une horloge Java 8? Donc, dans votre cadre de DI, vous pouvez créer un bean Clock:
@Bean
public Clock getClock() {
return Clock.systemUTC();
}
et ensuite dans vos tests, vous pouvez facilement vous en moquer:
@MockBean private Clock clock;
ou vous pouvez avoir un haricot différent:
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
ce qui aide avec des tests qui affirment des dates et des heures incommensurables.
default LocalDateTime getDateFromLong(long timestamp) {
try {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
} catch (DateTimeException tdException) {
// throw new
}
}
default Long getLongFromDateTime(LocalDateTime dateTime) {
return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}