有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将JSR310日期解析为即时?

我试图用JSR-310时间解析"2020-01-12+01:00"

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

这是理所当然的,但是,我想从中得到即时信息,即epochMillis,这样我就可以将long序列化到数据库中

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


共 (3) 个答案

  1. # 1 楼答案

    只要你知道怎么做就很容易了。我们需要的格式化程序是内置的。有一个复杂的事实是没有一个类型来解析字符串,没有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);
    

    结果和以前一样

  2. # 2 楼答案

    您需要使用^{},指定^{}格式和一天中的default时间(午夜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_DAYCLOCK_HOUR_OF_DAYMINUTE_OF_DAYSECOND_OF_DAYMILLI_OF_DAYMICRO_OF_DAYNANO_OF_DAY

    输出

    2020-01-11T23:00:00Z
    

    如果要保留时区偏移,则需要使用^{}(或^{})而不是^{}

    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
    
  3. # 3 楼答案

    您可以使用上面的Formatter使用LocalDate.parse(dateString, formatter)来提供一个LocalDate实例

    LocalDate可以在当天的任何时候给你一个LocalDateTime,但是(例如)你可以从中得到the start of day

    LocalDateTime有一个^{}方法给你一个Instant

    Instant有一个^{}方法来获取long