webentwicklung-frage-antwort-db.com.de

So erhalten Sie Millisekunden von LocalDateTime in Java 8

Ich frage mich, ob es eine Möglichkeit gibt, die aktuellen Millisekunden seit dem 1.1.1970 (Epoche) mithilfe der neuen Klassen LocalDate, LocalTime oder LocalDateTime von Java zu ermitteln. 8.

Der bekannte Weg ist unten:

long currentMilliseconds = new Date().getTime();

oder

long currentMilliseconds = System.currentTimeMillis();
226

Ich bin mir nicht ganz sicher, was Sie unter "aktuellen Millisekunden" verstehen, aber ich gehe davon aus, dass es die Anzahl der Millisekunden seit der "Epoche" ist, nämlich Mitternacht, 1. Januar 1970 UTC.

Wenn Sie die Anzahl der Millisekunden seit der Epoche ermitteln möchten , , verwenden Sie System.currentTimeMillis() als Anubian Noob hat darauf hingewiesen . In diesem Fall gibt es keinen Grund, eine der neuen Java.time-APIs zu verwenden.

Möglicherweise haben Sie jedoch bereits ein LocalDateTime oder ein ähnliches Objekt von irgendwoher und möchten es seit der Epoche in Millisekunden konvertieren. Dies ist nicht direkt möglich, da die LocalDateTime -Objektfamilie keine Ahnung hat, in welcher Zeitzone sie sich befinden. Daher müssen Zeitzoneninformationen bereitgestellt werden, um die Zeit relativ zur Epoche zu ermitteln, in der sich die Zeit befindet KOORDINIERTE WELTZEIT.

Angenommen, Sie haben ein LocalDateTime wie folgt:

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

Sie müssen die Zeitzoneninformationen anwenden und ZonedDateTime angeben. Ich bin in der gleichen Zeitzone wie Los Angeles, also würde ich so etwas machen:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

Dies macht natürlich Annahmen über die Zeitzone. Und es gibt Randfälle, die beispielsweise auftreten können, wenn die Ortszeit eine Zeit in der Nähe des Übergangs zur Sommerzeit benennt. Lassen Sie uns diese beiseite legen, aber Sie sollten sich bewusst sein, dass diese Fälle existieren.

Wie auch immer, wenn Sie ein gültiges ZonedDateTime erhalten, können Sie dies in die Anzahl der Millisekunden seit der Epoche umrechnen, wie folgt:

long millis = zdt.toInstant().toEpochMilli();
279
Stuart Marks

Was ich tue, damit ich keine Zeitzone spezifiziere, ist,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

gibt

ldt 1424812121078 
ctm 1424812121281

Nur für den Fall, dass Sie System.current nicht mögen, verwenden Sie Instant.now().toEpochMilli()

69
brian

So vermeiden Sie ZoneId:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

0 als Wert bekommen, das ist richtig!

17
Dani

Seit Java 8 können Sie Java.time.Instant.toEpochMilli() aufrufen.

Zum Beispiel der Anruf

final long currentTimeJava8 = Instant.now().toEpochMilli();

gibt Ihnen die gleichen Ergebnisse wie

final long currentTimeJava1 = System.currentTimeMillis();
11
Marteng

Sie können Java.sql.Timestamp auch verwenden, um Millisekunden zu erhalten.

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
8
Nalam

Verwenden Sie System.currentTimeMillis(), um die aktuelle Zeit in Millisekunden (seit der Epoche) abzurufen.

8
Anubian Noob

Wenn Sie eine Java 8-Uhr haben, können Sie clock.millis() verwenden (obwohl empfohlen wird, clock.instant() zu verwenden, um einen Java 8-Instant zu erhalten, da dies mehr ist) genau).

Warum sollten Sie eine Java 8 Uhr verwenden? So können Sie in Ihrem DI-Framework eine Clock-Bean erstellen:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

und dann in Ihren Tests können Sie es leicht verspotten:

@MockBean private Clock clock;

oder Sie können eine andere Bohne haben:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

das hilft bei Tests, die Daten und Zeiten unermesslich bestätigen.

2
JeeBee
  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();
}
0
Mohamed.Abdo