有 Java 编程相关的问题?

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

java我可以在DateTimeFormatterBuilder的格式之间切换吗?

我使用DateTimeFormatterBuilder()将我接收的JSON数据(注释代码)转换为两种格式之一。为了决定使用哪种格式,我使用一个正则表达式来查找正方形、[]括号的任何实例(在“*?”内有任何内容)。选择正确的格式后,我会将新值解析为另一个JSON对象

问题是,我的程序要么没有正确选择要使用的格式(要么是正则表达式和方法错误),要么没有正确设置格式(格式错误),不确定是哪种格式,而是发回一个错误(代码底部)

但是,这仅适用于具有方括号的数据。正确处理不带方括号的数据。我想知道是否有任何解决方案/建议来解决这个问题

// 2018-11-28T13:09:00.2-04:00
def utcDateFormatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                .appendPattern("xxx")
                .toFormatter()

// 2018-11-28T13:09:00.528-08:00[America/New_York]
def utcDateFormatterWithZone = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                .appendPattern("xxx'['VV']'")
                .toFormatter()


if (json.beginDateTime.find("\\[.*?\\]") == true) {
                object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatterWithZone).format(outFormatter))
            } else {
                object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatter).format(outFormatter))
            }

Error: Text '2019-09-26T15:01:07.941-05:00[America/New_York]' could not be parsed, unparsed text found at index 29

共 (1) 个答案

  1. # 1 楼答案

    这是内置的:DateTimeFormatter。ISO分区日期时间

    这可以做得容易得多。内置的DateTimeFormatter.ISO_ZONED_DATE_TIME与这两种格式都匹配

        String stringWithoutZoneId = "2018-11-28T13:09:00.2-04:00";
        String stringWithZoneId = "2018-11-28T13:09:00.528-08:00[America/New_York]";
    
        LocalDateTime parsedWithoutZoneId = LocalDateTime.parse(
                stringWithoutZoneId, DateTimeFormatter.ISO_ZONED_DATE_TIME);
        System.out.println(parsedWithoutZoneId);
        LocalDateTime parsedWithZoneId = LocalDateTime.parse(
                stringWithZoneId, DateTimeFormatter.ISO_ZONED_DATE_TIME);
        System.out.println(parsedWithZoneId);
    

    此代码段的输出为:

    2018-11-28T13:09:00.200
    2018-11-28T13:09:00.528
    

    也使用偏移量

    不过,有一个警告:您确定要忽略字符串中的偏移量吗?通过这些偏移量,字符串表示时间上明确的点。从解析到LocalDateTime中得到的是属于不同未知偏移量的日期时间。我看不出你如何能可靠地将它们用于任何有用的事情

    < P>考虑解析到{{CD3}}。一个argZonedDateTIme.parse甚至可以在没有任何显式格式化程序的情况下执行此操作。然后将这些ZonedDateTime直接存储在对象中,或者转换为Instant并存储它们。一个Instant表示一个时间点。如果无法更改存储的类型,可能需要将ZonedDateTime转换为UTC(或另一个约定的时区),然后转换为LocalDateTime。所有这些都是在不知道你的真实需求的情况下说的,所以我可能是错的,只是我认为不是

    你的代码出了什么问题

    @daggett是正确的:CharSequence.find返回一个字符串,因此要使if语句正常工作,您需要:

        if (json.beginDateTime.find("\\[.*?\\]") != null) {
    

    AString永远不能等于true,因此始终选择不带区域的格式化程序

    链接

    Documentation of ^{}