我有一个外部API,它返回我的时间长度,表示为Epoch开始以来的毫秒数。
使用旧风格的Java API,我将简单地从它构造一个Date
Date myDate = new Date(startDateLong)
在Java 8的LocalDate/LocalDateTime类中有什么等价的?
我感兴趣的是将long表示的时间点转换为当前本地时区中的LocalDate。
我有一个外部API,它返回我的时间长度,表示为Epoch开始以来的毫秒数。
使用旧风格的Java API,我将简单地从它构造一个Date
Date myDate = new Date(startDateLong)
在Java 8的LocalDate/LocalDateTime类中有什么等价的?
我感兴趣的是将long表示的时间点转换为当前本地时区中的LocalDate。
当前回答
如果您拥有Epoch之后的毫秒数,并希望使用当前本地时区将其转换为本地日期,则可以使用Instant。ofEpochMilli(长epochMilli)
LocalDate date =
Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();
但是请记住,即使是系统的默认时区也可能会改变,因此相同的长值在随后的运行中可能会产生不同的结果,即使是在同一台机器上。
此外,请记住LocalDate不同于java.util。Date,真正代表的是日期,而不是日期和时间。
否则,你可以使用LocalDateTime:
LocalDateTime date =
LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
其他回答
你可以从Instant.ofEpochMilli(long)开始:
LocalDate date =
Instant.ofEpochMilli(startDateLong)
.atZone(ZoneId.systemDefault())
.toLocalDate();
用long值替换now.getTime()。
//GET UTC time for current date
Date now= new Date();
//LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
LocalDate localDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDate();
DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));
如果您拥有Epoch之后的毫秒数,并希望使用当前本地时区将其转换为本地日期,则可以使用Instant。ofEpochMilli(长epochMilli)
LocalDate date =
Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();
但是请记住,即使是系统的默认时区也可能会改变,因此相同的长值在随后的运行中可能会产生不同的结果,即使是在同一台机器上。
此外,请记住LocalDate不同于java.util。Date,真正代表的是日期,而不是日期和时间。
否则,你可以使用LocalDateTime:
LocalDateTime date =
LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
我已经测试了LocalDateTime的替代解决方案:
public static LocalDateTime increaseByMillis(final LocalDateTime ldt, final long millis)
{
return LocalDateTime.ofInstant(Instant.ofEpochMilli(ldt.toInstant(ZoneOffset.UTC).toEpochMilli()+millis), ZoneId.of(ZoneOffset.UTC.getId()));
}
测试:
LocalDateTime test = LocalDateTime.now();
LocalDateTime increased = MyUtilsAbc.increaseByMillis(test, 1000);
Assert.assertEquals("Increase of LocalDateTime not working (anymore)!", test.toEpochSecond(ZoneOffset.UTC) +1, increased.toEpochSecond(ZoneOffset.UTC));
在一个特定的情况下,你的epoch seconds时间戳来自SQL或以某种方式与SQL相关,你可以像这样获得它:
long startDateLong = <...>
LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();