2017-05-06 2 views
-3

Ich erhalte diese Ausnahme, wenn ich versuche, epochTime zu konvertieren LOCALDATE wo:java.time.DateTimeException: ungültiger Wert für Jahr (gültige Werte -999.999.999-999.999.999)

1) Datum: 2017.05.05 10: 08: 52,0

2) entsprechende Epoche: 1493959132000

LocalDate lastUpdatedDate = LocalDate.ofEpochDay(1493959132000); 

Ausnahme:

java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): 4090323145 
    at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330) 
    at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722) 
    at java.time.LocalDate.ofEpochDay(LocalDate.java:341) 

Ich verstehe, dass der Quellcode von java.time.LocalDate bei https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#ofEpochDay-long-

eine vorherige Warnung gibt. Was bedeutet das eigentlich und wann kommt es?

+5

Nun, 1493959132000 Tage, ist ungefähr 1493959132000/365 = 4.093.000.000 Jahre wie in der Ausnahmebedingungsnachricht angegeben. Deine Annahmen sind falsch. 4.000.000.000 + epochYear> 2017. Epochenjahr ist 1970, also (2017-1970) * 365 fast entspricht 17500 Tagen ... –

+2

Noch einmal, das Lesen des Javadoc der Methode, die Sie anrufen, würde viel helfen. https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#ofEpochDay-long- –

Antwort

4

Here's javadoc von ofEpochDay, ist es das, was es sagt:

Dies gibt eine LOCALDATE mit dem angegebenen epoche Tag. Das EPOCH_DAY ist eine einfache inkrementierende Anzahl von Tagen, an denen Tag 0 1970-01-01 ist. Negative Zahlen repräsentieren frühere Tage.

Also, es erwartet das Argument die Anzahl der Tage seit 1970-01-01. Da der Wert, den Sie übergeben, nicht gültig ist, wird der Wert Exception ausgegeben.

Nun, um Ihren Anwendungsfall kommen, wenn Sie Zeit Zeit umwandeln möchten dann LOCALDATE Sie benötigen ofEpochMilli Methode der Instant Klasse verwenden, z.B .:

LocalDate localDate = 
     Instant.ofEpochMilli(1493959132000l).atZone(ZoneId.systemDefault()).toLocalDate(); 
System.out.println(localDate); 

Here's javadoc für Instant Klasse.

aktualisieren

Alternativ können Sie die Zeitstempel in Anzahl der Tage seit 1970-01-01 und es ofEpochDay() Methode übergeben umwandeln kann, zB:

LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24)); 
System.out.println(localDate); 
0

Wenn man darüber nachdenkt, es macht keinen Sinn umwandeln epoch Sekunden zu lokalen Daten. Zu einem bestimmten Zeitpunkt benötigen Sie noch einen Standort/eine Zeitzone, um zu bestimmen, auf welcher Seite der Datumsgrenzlinie Sie sich befinden.

Die von Ihnen erwähnte Epoche ist Fr, 05 Mai 2017 04:38:52 UTC. Wenn Sie in Greenwhich sind, wäre das LocalDate der 5. Mai, aber wenn Sie an der Westküste der USA sind, ist es immer noch der 4. Mai. Hier ist ein list converting that epoch to different time zones

Instant.ofEpochMilli(1493959132000L).atZone(ZoneOffset.UTC).toLocalDate() //2017-05-05 
Instant.ofEpochMilli(1493959132000L).atZone(ZoneId.of("America/Chicago")).toLocalDate() //2017-05-04 

daher das Argument für die Höhe der Zeit fragt Tage zu einem lokalen Datum zu konvertieren.

LocalDate.ofEpochDay(17291) //2017-05-05 
Verwandte Themen