如何从长纪元时间(以毫秒为单位)创建 Java 8 LocalDate?

问题描述 投票:0回答:9

我有一个外部 API,它以

long
s 的形式返回日期,表示为自纪元开始以来的毫秒数。

使用旧式 Java API,我只需用

 构造一个 
Date

Date myDate = new Date(startDateLong)

Java 8 的

LocalDate
/
LocalDateTime
类中的等效项是什么?

我有兴趣将

long
表示的时间点转换为我当前本地时区的
LocalDate

java datetime java-8 java-time
9个回答
603
投票

如果您有自纪元以来的毫秒数,并希望使用当前本地时区将它们转换为本地日期,您可以使用

Instant.ofEpochMilli(long epochMilli)

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

但请记住,即使系统的默认时区也可能会发生变化,因此相同的

long
值可能会在后续运行中产生不同的结果,即使在同一台机器上也是如此。

此外,请记住,

LocalDate
java.util.Date
不同,它真正代表日期,而不是日期和时间。

否则,您可以使用

LocalDateTime

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());

65
投票

您可以从Instant.ofEpochMilli(long)开始:

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

19
投票

我想我有更好的答案。

new Timestamp(longEpochTime).toLocalDateTime();

9
投票

基于 @Michael Piefel 回答的简单版本

LocalDate myDate = LocalDate.ofEpochDay(Duration.ofMillis(epochMillis).toDays());

7
投票

时区和其他东西放在一边,

new Date(startDateLong)
的一个非常简单的替代方案可能是
LocalDate.ofEpochDay(startDateLong / 86400000L)


3
投票

将 now.getTime() 替换为您的 long 值。

//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));

1
投票

我已经测试了 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));

0
投票

如果创建

LocalDateTime
,最有效的方法是使用工厂方法https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/ LocalDateTime.html#ofEpochSecond(long,int,java.time.ZoneOffset) - 因此无需创建
Instant
实例的间接步骤:

LocalDateTime.of(millis / 1000, 1000 * (millis % 1000), ZoneOffset.UTC);`

表达式

millis / 1000
用于确定秒数,
1000 * (millis % 1000)
用于确定纳秒数。您可以根据需要使用任何其他时区偏移。


-7
投票

在您的纪元秒时间戳来自 SQL 或以某种方式与 SQL 相关的特定情况下,您可以这样获取它:

long startDateLong = <...>

LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();
© www.soinside.com 2019 - 2024. All rights reserved.