如何在 java 13 或更高版本中格式化 OffsetDateTime?

互联网 行业动态 更新时间:2024-06-13 00:19:06

Ole*_*.V. 5

OffsetDateTime 始终具有纳秒精度。now取决于平台和Java版本,它的方法可能没有。对象内部有。因此,您不可能OffsetDateTime在秒上拥有少于 9 位小数的小数。

打印多少个小数是一个不同的问题。打印 an 时真正打印的OffsetDateTimeString. 如果你只是打印对象,它的toString方法会被隐式调用以生成我们在打印中看到的字符串。OffsetDateTime.toString()总是为我们提供尽可能多的 3 位小数组,以提供完整的精度。因此,如果小数为.100000000,则.100打印。如果它们是.309594500,正如您已经看到的那样,所有 9 位小数都存在于字符串中。您无法更改此行为。

如果你想打印一个不同的字符串,你可以使用DateTimeFormatter你喜欢的小数位数。

所以你可以做什么:

您可以修改OffsetDateTime,或者实际上,您可以创建一个新的,就像旧的一样,只是更多的小数为零,这反过来可能会导致打印的小数更少toString()。 您可以将其格式化OffsetDateTime为您喜欢的字符串。

以下代码片段结合了这两个选项。对于仅格式化到最后一个非零小数的小数,我使用以下格式化程序:

private static final DateTimeFormatter ODT_FORMATTER = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM-dd'T'HH:mm.ss")
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
        .appendOffsetId()
        .toFormatter(Locale.ROOT);

示范:

    OffsetDateTime dateTime = OffsetDateTime.parse("2021-12-10T10:58:05.309594500+01:00");

    int nanos = dateTime.getNano();
    OffsetDateTime with7Decimals = dateTime.withNano(nanos / 100 * 100);
    System.out.println("toString(): " + with7Decimals);
    System.out.println("Formatted:  " + with7Decimals.format(ODT_FORMATTER));
    OffsetDateTime with5Decimals = dateTime.withNano(nanos / 10000 * 10000);
    System.out.println("toString(): " + with5Decimals);
    System.out.println("Formatted:  " + with5Decimals.format(ODT_FORMATTER));

输出:

toString(): 2021-12-10T10:58:05.309594500+01:00
Formatted:  2021-12-10T10:58.05.3095945+01:00
toString(): 2021-12-10T10:58:05.309590+01:00
Formatted:  2021-12-10T10:58.05.30959+01:00

对于您的测试,我认为没有理由使用字符串进行比较。只需OffsetDateTime在将这些小数设置为零之后比较对象,无论如何这些对象都会丢失在您的数据库中。

编辑:测试失败的解决方法?以下行是您获取当前时间的位置,其精度比您的数据库可以存储的精度更高。

        dateTime = OffsetDateTime.now(),

因此,将其更改为仅提供数据库支持的精度:

        dateTime = OffsetDateTime.now().truncatedTo(ChronoUnit.MICROS),

这应该会导致无需进一步舍入即可保存和检索时间。

为什么会出现问题? OffsetDateTime.now()在不同的平台和Java版本上具有不同的精度。我不知道任何平台上的 Java 11 和 13 之间的区别,但是没有理由不应该有一个,并且在未来的某个版本中可能会有另一个。此外,如果您在 Linux、Windows 和 Mac 之间移动,即使使用相同的 Java 版本,您也可能会遇到差异。问题的另一部分是您的数据库的有限精度,或者更准确地说,是您在数据库中用于存储时间的数据类型。如果您正在使用timestamp with time zone,您可能拥有数据库可以提供的最佳精度。显然,您的数据库具有微秒精度(秒为 6 位小数)和 Java 13OffsetDateTime.now()具有至少半微秒(500 纳秒)的精度。因此,从 Java 13 开始,您将获得数据库无法存储的值。显然,您的数据库或数据库驱动程序随后将您的值向上取整。这导致从数据库中检索到的值与您尝试保存的值不完全相同。

更多推荐

或更高,版本,如何在,java,OffsetDateTime

本文发布于:2023-04-20 20:45:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/ab05b25cbd33ef8f52072791437f85ba.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:或更高   版本   如何在   java   OffsetDateTime

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!