java.time.DateTimeFormatter:需要始终呈现毫秒的ISO_INSTANT

弗洛伦特

我正在尝试将日期时间管理中的各种代码混合到仅Java 8java.time名称空间。现在我有一个小问题用默认DateTimeFormatterInstantDateTimeFormatter.ISO_INSTANT格式只能说明毫秒时,他们不等于零。

将纪元呈现为,1970-01-01T00:00:00Z而不是1970-01-01T00:00:00.000Z

我进行了单元测试来解释该问题以及我们如何最终确定日期才能相互比较。

@Test
public void java8Date() {
    DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
    String epoch, almostEpoch, afterEpoch;

    { // before epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(-1);
        almostEpoch = formatter.format(instant);
        assertEquals("1969-12-31T23:59:59.999Z", almostEpoch );
    }

    { // epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(0);
        epoch = formatter.format(instant);
        // This fails, I get 1970-01-01T00:00:00Z instead
        assertEquals("1970-01-01T00:00:00.000Z", epoch );
    }

    { // after epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(1);
        afterEpoch = formatter.format(instant);
        assertEquals("1970-01-01T00:00:00.001Z", afterEpoch );
    }

    // The end game is to make sure this rule is respected (this is how we order things in dynamo):
    assertTrue(epoch.compareTo(almostEpoch) > 0);
    assertTrue(afterEpoch.compareTo(epoch) > 0); // <-- This assert would also fail if the second assert fails

    { // to confirm we're not showing nanos
        assertEquals("1970-01-01T00:00:00.000Z", formatter.format(Instant.EPOCH.plusNanos(1)));
        assertEquals("1970-01-01T00:00:00.001Z", formatter.format(Instant.EPOCH.plusNanos(1000000)));
    }
}
弗洛伦特

好的,我查看了源代码,它非常简单:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter();

我希望它适用于所有情况,并且可以帮助其他人。不要犹豫,添加一个更好/更干净的答案。

只是为了说明它的来源,在JDK的代码中

ISO_INSTANT 定义如下:

public static final DateTimeFormatter ISO_INSTANT;
static {
    ISO_INSTANT = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendInstant()
            .toFormatter(ResolverStyle.STRICT, null);
}

DateTimeFormatterBuilder::appendInstant声明为:

public DateTimeFormatterBuilder appendInstant() {
    appendInternal(new InstantPrinterParser(-2));
    return this;
}

构造函数的InstantPrinterParser签名是:

InstantPrinterParser(int fractionalDigits)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java 8-ZonedDateTime的DateTimeFormatter和ISO_INSTANT问题

来自分类Dev

Java 8 - DateTimeFormatter and ISO_INSTANT issues with ZonedDateTime

来自分类Dev

将Joda time Instant转换为Java time Instant

来自分类Dev

java.time.format.DateTimeParseException 使用 DateTimeFormatter

来自分类Dev

从ISO 8601祖鲁字符串转换日期为java.time.Instant在Java中8

来自分类Dev

如何使用毫秒映射java.time.LocalTime与毫秒中的java.sql.Time

来自分类Dev

如何在Spring Webflux中将java.time.Instant序列化为ISO字符串

来自分类Dev

Hibernate @Temporal for Java 8 java.time.Instant

来自分类Dev

时区偏移量的java.time DateTimeFormatter模式

来自分类Dev

使用新的java.time.DateTimeFormatter解析日期和时间

来自分类常见问题

在Java中将毫秒转换为Time返回错误值

来自分类Dev

Java Time API将ISO 8601转换为ZonedDateTime

来自分类Dev

使用java.time.DateTimeFormatter格式化Java日期,包括时间偏移

来自分类Dev

为什么Java的java.time.format.DateTimeFormatter#format(LocalDateTime)增加一年?

来自分类Dev

比较java.time.ZonedDateTime的实例,而忽略Java 8中的比较秒和毫秒瞬间

来自分类Dev

在java.time中将时间正确转换为毫秒(Java 8)

来自分类Dev

在java.time中将时间正确转换为毫秒(Java 8)

来自分类Dev

java.time.Instant-> java.sql.Timestamp在Windows和* nix(与时区相关)上的行为不同

来自分类Dev

差异将java.util.Date和java.time.Instant之间古老的日期时,

来自分类Dev

使用Java 8 java.time api(仅标准版)解析ISO时间戳

来自分类Dev

Unicode ICU而非java.time.DateTimeFormatter应该用于国际日期和时间

来自分类Dev

使用JPA2 / Hibernate持久化java.time.Instant(JDK8)

来自分类Dev

可以输入不反序列化值`java.time.Instant` - 杰克逊

来自分类Dev

为什么加个星期java.time.Instant不支持?

来自分类Dev

Instant.parse和RFC3339串抛出java.time.format.DateTimeParseException

来自分类Dev

Spring Boot-Jersey Client-Jackson无法构造`java.time.Instant`的实例

来自分类Dev

elasticsearch 是否支持对序列化的 java.time.Instant 字段进行搜索和报告?

来自分类Dev

如何测试包含 java.time.Instant 字段的 spring-cloud-contract

来自分类Dev

Avro序列化异常-无法将java.time.Instant强制转换为java.lang.Long

Related 相关文章

  1. 1

    Java 8-ZonedDateTime的DateTimeFormatter和ISO_INSTANT问题

  2. 2

    Java 8 - DateTimeFormatter and ISO_INSTANT issues with ZonedDateTime

  3. 3

    将Joda time Instant转换为Java time Instant

  4. 4

    java.time.format.DateTimeParseException 使用 DateTimeFormatter

  5. 5

    从ISO 8601祖鲁字符串转换日期为java.time.Instant在Java中8

  6. 6

    如何使用毫秒映射java.time.LocalTime与毫秒中的java.sql.Time

  7. 7

    如何在Spring Webflux中将java.time.Instant序列化为ISO字符串

  8. 8

    Hibernate @Temporal for Java 8 java.time.Instant

  9. 9

    时区偏移量的java.time DateTimeFormatter模式

  10. 10

    使用新的java.time.DateTimeFormatter解析日期和时间

  11. 11

    在Java中将毫秒转换为Time返回错误值

  12. 12

    Java Time API将ISO 8601转换为ZonedDateTime

  13. 13

    使用java.time.DateTimeFormatter格式化Java日期,包括时间偏移

  14. 14

    为什么Java的java.time.format.DateTimeFormatter#format(LocalDateTime)增加一年?

  15. 15

    比较java.time.ZonedDateTime的实例,而忽略Java 8中的比较秒和毫秒瞬间

  16. 16

    在java.time中将时间正确转换为毫秒(Java 8)

  17. 17

    在java.time中将时间正确转换为毫秒(Java 8)

  18. 18

    java.time.Instant-> java.sql.Timestamp在Windows和* nix(与时区相关)上的行为不同

  19. 19

    差异将java.util.Date和java.time.Instant之间古老的日期时,

  20. 20

    使用Java 8 java.time api(仅标准版)解析ISO时间戳

  21. 21

    Unicode ICU而非java.time.DateTimeFormatter应该用于国际日期和时间

  22. 22

    使用JPA2 / Hibernate持久化java.time.Instant(JDK8)

  23. 23

    可以输入不反序列化值`java.time.Instant` - 杰克逊

  24. 24

    为什么加个星期java.time.Instant不支持?

  25. 25

    Instant.parse和RFC3339串抛出java.time.format.DateTimeParseException

  26. 26

    Spring Boot-Jersey Client-Jackson无法构造`java.time.Instant`的实例

  27. 27

    elasticsearch 是否支持对序列化的 java.time.Instant 字段进行搜索和报告?

  28. 28

    如何测试包含 java.time.Instant 字段的 spring-cloud-contract

  29. 29

    Avro序列化异常-无法将java.time.Instant强制转换为java.lang.Long

热门标签

归档