【问题标题】:How to get current date in UTC zone as long value in java 8如何在 UTC 区域中获取当前日期作为 java 8 中的长值
【发布时间】:2019-11-08 11:34:24
【问题描述】:

如何在 java 8 日期时间 API 中实现以下功能

long currentDate = Date.UTC(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
System.out.println(currentDate);

以上代码返回

1573171200000

我已尝试关注

ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneOffset.UTC);
System.out.println(zonedDateTime.toEpochSecond());

返回

1573212520

【问题讨论】:

  • 如何定义“长值”?它是自 1970-01-01T00Z 以来的毫秒数吗?请明确说明。您的第二个结果有什么问题,这也是一个“长值”(以秒为单位而不是毫秒)?

标签: java date datetime java-8


【解决方案1】:

获取今天的LocalDate,在一天开始时将其转换为ZonedDateTime,然后转换为Instant并获取纪元毫秒:

LocalDate.now().atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli()

【讨论】:

  • 或者首先使用即时,Instant.now().truncatedTo(ChronoUnit.DAYS).toEpochMilli()
  • 您可能还需要LocalDate.now(ZoneOffset.UTC)。不仅因为您想要 UTC 日期,还因为您要让读者清楚您获得的是哪个时区的日期。
  • @Holger 这也是一个选项。就我个人而言,我发现答案中的版本更易于阅读,但这只是个人喜好问题,因此感谢您为提问者和每个人提供了第二个选择。
  • @OleV.V.对我来说,使用在不同事物之间进行转换的解决方案看起来很不自然,当有替代方案可以首先与预期事物一起运行时。
【解决方案2】:

其实这两个结果都是正确的,只是你误解了发生了什么:

在您使用 Date 的第一条语句中,您将小时、分钟、秒定义为0

对于ZoneDateTime,您使用的是now(),它将为您提供当前日期时间

要获得相同的时间,我猜你需要:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.now(),
        LocalTime.of(0,0,0), 
        ZoneOffset.UTC);
 Long zdtm = zonedDateTime.toInstant().toEpochMilli();

现在两种方法都返回:

1573171200000
1573171200000

Ideone demo

【讨论】:

  • long result = Instant.now().truncatedTo(ChronoUnit.DAYS).toEpochMilli();...
【解决方案3】:

如果您不需要 ZonedDateTime,只需使用

System.out.println(Instant.now().toEpochMilli());

编辑:我误解了你从一开始就需要千分之一。 YCF_L 对 Holger 添加的回答是正确的。

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 2014-09-08
    • 2010-09-23
    • 1970-01-01
    • 2010-11-21
    • 2017-12-13
    • 2012-07-30
    • 2021-12-16
    相关资源
    最近更新 更多