2017-05-06 25 views
-3

私はどこLOCALDATEするepochTimeを変換しようとしていたとき、私はこの例外を取得しています:java.time.DateTimeException:年の値が無効です(有効な値-999999999 - 999999999)

1)日:2017年5月5日10:08:52.0

2)に対応するエポック:1493959132000

LocalDate lastUpdatedDate = LocalDate.ofEpochDay(1493959132000); 

例外:

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) 

私は、java.time.LocalDateのソースコードがこの例外の事前警告を与えることを理解しています。https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#ofEpochDay-long-

これは実際に何を意味しますか? ofEpochDay

+5

例外メッセージに記載されているように、1493959132000日は、おおよそ1493959132000/365 = 4,093,000,000年です。あなたの前提は間違っています。 4,000,000,000 + epoch年> 2017年です。1970年の年であるため、(2017-1970)* 365は17500日とほぼ同じです... –

+2

もう一度、呼び出すメソッドのjavadocを読むと、多くの助けになります。 https://docs / –

答えて

4

Here'sのjavadoc、これはこう言われる、

これは、指定されたエポック日間でLOCALDATEを返します。 EPOCH_DAY は、0日が1970-01-01である単純な増分カウントです。 負の数値は、以前の日を表します。

したがって、引数は1970-01-01からの日数であることが予想されます。渡す値が無効なので、Exceptionがスローされます。今

、あなたがLOCALDATEするエポック時刻を変換したい場合は、あなたのユースケースに来て、その後、あなたはInstantクラスのofEpochMilli方法、例えばを使用する必要があります。:

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

Here'sInstantクラスのjavadoc。

更新

また、あなたは例えば、1970年1月1日以降の日数にタイムスタンプを変換し、ofEpochDay()メソッドに渡すことができます:

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

あなたが考えてみれば、それは意味変換しないepoch 現地日に。特定の瞬間には、日付境界線のどちら側にいるかを判断するために、依然として位置/時間帯が必要です。

あなたが言及するエポックは、金曜日、05 May 2017 04:38:52 UTCです。あなたがGreenにいるなら、LocalDateは5月5日ですが、あなたが米国西海岸にいれば、まだ5月4日です。ここで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 

は、そのための引数はは、ローカルの日付に変換するエポックの量を要求します。

関連する問題