0

我试图"2020-01-12+01:00"用 JSR-310 时间来解析让我们说。

我通过 阅读它DateTimeFormatter.ofPattern("yyyy-MM-ddVV"),但是现在如果我想将其转换为 Instant via Instant.from(DateTimeFormatter.ofPattern("yyyy-MM-ddVV").parse("..."),它会抛出它抱怨time为空的地方。

确实如此,但是,我想从中获得 Instant,即 epochMillis,因此我可以将其序列化long到数据库中。

有办法解决吗?基本上我想像往常一样扩展"2020-01-12+01:00"to"2020-01-12T00:00.000+01:00"并将其解析为 Instant

4

3 回答 3

1

您需要使用DateTimeFormatterBuilder, 指定ISO_DATE格式和默认时间(午夜1):

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_DATE)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .toFormatter();
Instant instant = Instant.from(formatter.parse("2020-01-12+01:00"));
System.out.println(instant);

1)ChronoField可以是任何时间字段,即HOUR_OF_DAY, CLOCK_HOUR_OF_DAY, MINUTE_OF_DAY, SECOND_OF_DAY, MILLI_OF_DAY, MICRO_OF_DAY, 或NANO_OF_DAY

输出

2020-01-11T23:00:00Z

如果要保留时区偏移量,则需要使用OffsetDateTime(or ZonedDateTime) 而不是Instant

OffsetDateTime dateTime = OffsetDateTime.parse("2020-01-12+01:00", formatter);
System.out.println(dateTime);
System.out.println(dateTime.format(DateTimeFormatter.ISO_DATE));

输出(来自 OffsetDateTime 和 ZonedDateTime)

2020-01-12T00:00+01:00
2020-01-12+01:00
于 2020-02-12T02:24:09.493 回答
0

当您知道如何操作时,这很容易。我们需要的格式化程序是内置的。有一个复杂的事实是没有将字符串解析成的类型,没有OffsetDate。我提出了解决这个问题的两种选择。

    String s = "2020-01-12+01:00";

    TemporalAccessor parsed = DateTimeFormatter.ISO_OFFSET_DATE.parse(s);
    LocalDate date = LocalDate.from(parsed);
    ZoneOffset offset = ZoneOffset.from(parsed);
    Instant result = date.atStartOfDay(offset).toInstant();

    System.out.println(result);

此片段的输出是:

2020-01-11T23:00:00Z

我们很少需要TemporalAccessor直接使用接口,它被认为是低级的。这也不是去这里的唯一途径。另一个不错的选择是定义一天中的默认时间,以便我们可以直接解析为Instant

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_OFFSET_DATE)
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();
    Instant result = formatter.parse(s, Instant::from);

结果和以前一样。

于 2020-02-13T19:08:05.167 回答
0

您可以使用LocalDate.parse(dateString, formatter)上面Formatter所做的来给您一个LocalDate实例。

LocalDateLocalDateTime然后可以在当天的任何时间给你一个,但是(例如)你可以从中得到一天的开始

LocalDateTime有一种toInstant方法可以给你一个Instant.

Instant有一种toEpochMilli方法可以让你的long.

于 2020-02-12T01:07:58.283 回答