当前位置: 首页 > 知识库问答 >
问题:

Java 8和Java 11中LocalDateTime到毫秒的差异

夔宏深
2023-03-14
@Test
public void testDateTime() {
    LocalDateTime expected = LocalDateTime.now().plusDays(1L);

    // converter contents
    long epochMillis = expected.atZone(ZoneId.systemDefault())
            .toInstant().toEpochMilli();
    LocalDateTime actual = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis),
            TimeZone.getDefault().toZoneId());


    assertThat(actual, equalTo(expected));
}
Expected :<2021-06-02T14:06:21.820299>
Actual   :<2021-06-02T14:06:21.820>

我可以使用assertthat(actual,equalTo(expected.truncatedto(chronounit.millis))对expected进行中继,使它们相等,但是,这意味着每次对被测试的转换器类进行比较(isAfter,isBefore,equals),都必须应用中继。

对于JDK 11(或者我可能错过的文档:),是否有适当的方法在localdatetimelong之间进行转换,反之亦然?

更新:

public Long localDateTimeToEpochMillis(LocalDateTime ldt) {
    Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
        return ldt.atZone(ZoneId.systemDefault())
           .toInstant().toEpochMilli();
}
public LocalDateTime epochMillisToLocalDateTime(long epochMillis) {
    return LocalDateTime.ofInstant(
            Instant.ofEpochMilli(epochMillis), 
            ZoneId.systemDefault());
}

现有的测试似乎验证的是,给定一个长值,我应该得到相同的LocalDateTime等价物,这是通过使用给定的(转换为长值的LocalDateTime)然后返回LocalDateTime进行比较来完成的。

共有1个答案

关苗宣
2023-03-14

如果你看一下区别:

Expected :<2021-06-02T14:06:21.820299>
Actual   :<2021-06-02T14:06:21.820>

你可以看到它移除任何小于毫秒的东西。

发生这种情况是因为您将LocalDateTime转换为毫秒:

.toInstant().toEpochMilli();
Instant instant=expected.atZone(ZoneId.systemDefault())
                .toInstant();
long epochMillis = instant.toEpochMilli();
long nanos=instant.getNano()%1000000;//get nanos of Millisecond

LocalDateTime actual = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis).plusNanos(nanos),
        TimeZone.getDefault().toZoneId());
 类似资料:
  • 我在使用Java8的java应用程序中工作。 我已经集成了数据库(多个数据库Oracle,MySQL,Postgres)和其中在DB i字符串创建的日期。 DB中的日期格式为-2015-07-29 16:23:28.143 我从DB获取这个,并在Localdatetime对象中设置 所以这里的问题是我不想在响应中显示/发送毫秒。我想显示/发送日期,如2015-07-29 16:23:28 我尝试了

  • 问题内容: 我做了一些研究,但仍然找不到如何得到的日子…这是我得到的: 请帮助,我在数学上很烂,谢谢。 问题答案: 如果您没有另一个大于天的时间间隔: 如果您还有几个星期: 如果可能的话,最好避免使用几个月和几年,因为它们没有明确定义的固定长度。严格来说,两天都没有:夏令时意味着天的长度可以不是24小时。

  • 问题内容: 我想知道如果有一种方法,因为1970年1月1日(时期),以获得当前毫秒使用新的,或Java的8类。 已知的方法如下: 要么 问题答案: 我不能完全确定“当前毫秒”的含义,但我假设这是自“纪元”(即UTC 1970年1月1日午夜)以来的毫秒数。 如果你想找到,因为时代的毫秒数 眼下, 然后用作为nubian菜鸟指出。如果是这样,则没有理由使用任何新的java.time API来执行此操作

  • 问题内容: 我在截断数据时遇到了一些麻烦。我正在使用SQL的GETDATE()函数来获取当前日期和时间,并将它们输入数据库。但是,我只想保存日期和时间直到分钟。换句话说,我希望在输入新数据时保存dd/ mm / yyyy hh:mm:00.000或dd / mm / yyyy hh:mm。我该怎么做呢? 我应该注意我正在使用MS-SQL。 问题答案: 有许多方法可以做到这一点。 例如,您可以将生成

  • 问题内容: 我正在编写一个赛车应用程序,想要将大量毫秒转换为minutes:seconds.milliseconds(例如)。目前,我只是通过数学()进行运算,然后求余数并进一步除法,依此类推,但是我发现它时不时关闭1毫秒。我知道这听起来似乎没什么大不了的,但是我试图找到和的平均值,然后返回,这意味着它输入不正确,而应用程序的其余部分无法处理。 有没有一种方法使用或格式化毫秒到MM或类似的东西:s