Java 将不带ZonedId的字符串转换为OffsetDateTime

Java 将不带ZonedId的字符串转换为OffsetDateTime,java,datetime,timezone-offset,zoneddatetime,Java,Datetime,Timezone Offset,Zoneddatetime,我想将字符串转换为OffsetDateTime数据类型。该字符串具有以下形状: 2017-11-27T19:06:03 我尝试了两种方法: 方法1 方法2: 第一种方法不起作用,因为它抱怨如下: java.time.format.DateTimeParseException:无法分析文本“2017-11-27T19:02:42”:无法从TemporalAccessor获取OffsetDateTime:{},ISO解析为2017-11-27T19:02:42,类型为java.time.for

我想将字符串转换为OffsetDateTime数据类型。该字符串具有以下形状:

  2017-11-27T19:06:03
我尝试了两种方法:

方法1

方法2:

第一种方法不起作用,因为它抱怨如下:

java.time.format.DateTimeParseException:无法分析文本“2017-11-27T19:02:42”:无法从TemporalAccessor获取OffsetDateTime:{},ISO解析为2017-11-27T19:02:42,类型为java.time.format.parsed

就我的理解而言,它来自于字符串没有ZoneId的事实。如何在格式化程序上覆盖ZoneId以忽略它

第二种方法来了,但它需要2个额外的转换,我想避免这些额外的转换


感谢您的帮助。

最后,我通过以下代码解决了此问题:

    public static OffsetDateTime convertString(String timestamp) {
        java.time.format.DateTimeFormatter formatter = new java.time.format.DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .append(java.time.format.DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .appendValue(HOUR_OF_DAY, 2)
            .appendLiteral(':')
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
            .toFormatter();

    return LocalDateTime.parse(timestamp, formatter)
            .atOffset(java.time.ZoneOffset.UTC);
    }

最后,我通过以下代码解决了这个问题:

    public static OffsetDateTime convertString(String timestamp) {
        java.time.format.DateTimeFormatter formatter = new java.time.format.DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .append(java.time.format.DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .appendValue(HOUR_OF_DAY, 2)
            .appendLiteral(':')
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
            .toFormatter();

    return LocalDateTime.parse(timestamp, formatter)
            .atOffset(java.time.ZoneOffset.UTC);
    }
要从没有偏移量或时区的字符串中获取OffsetDateTime,需要确定偏移量或获取偏移量的方法。最明显的方法是,如果您知道在哪个时区解释日期时间。例如:

    OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
            .atZone(ZoneId.of("Asia/Chongqing"))
            .toOffsetDateTime();
    System.out.println(dateTime);
使用问题中的字符串输出:

2017-11-27T19:06:03+08:00

不要害怕从LocalDateTime到ZonedDateTime再到OffsetDateTime的两种转换。使用java.time,它们不仅易于操作,而且易于阅读

如果你知道偏移量,就用它吧,那么你只需要一次转换。我正在用一个无意义的偏移量作为例子,所以你必须选择你自己的:

    OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
            .atOffset(ZoneOffset.ofTotalSeconds(-36953));
    System.out.println(dateTime);
输出:

2017-11-27T19:06:03-10:15:53

您可以指定所需的偏移量,例如+08:00的ZoneOffset.of或Hours8的ZoneOffset.of

但现在是时候回答你的问题了

如何在格式化程序上覆盖ZoneId以忽略它

输出与上一个相同,您需要再次选择在您的情况下有意义的偏移量。

要从没有偏移量或时区的字符串中获取OffsetDateTime,您需要确定偏移量或获取偏移量的方法。最明显的方法是,如果您知道在哪个时区解释日期时间。例如:

    OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
            .atZone(ZoneId.of("Asia/Chongqing"))
            .toOffsetDateTime();
    System.out.println(dateTime);
使用问题中的字符串输出:

2017-11-27T19:06:03+08:00

不要害怕从LocalDateTime到ZonedDateTime再到OffsetDateTime的两种转换。使用java.time,它们不仅易于操作,而且易于阅读

如果你知道偏移量,就用它吧,那么你只需要一次转换。我正在用一个无意义的偏移量作为例子,所以你必须选择你自己的:

    OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
            .atOffset(ZoneOffset.ofTotalSeconds(-36953));
    System.out.println(dateTime);
输出:

2017-11-27T19:06:03-10:15:53

您可以指定所需的偏移量,例如+08:00的ZoneOffset.of或Hours8的ZoneOffset.of

但现在是时候回答你的问题了

如何在格式化程序上覆盖ZoneId以忽略它


输出与前一个相同,您需要再次选择一个在您的情况下有意义的偏移量。

您的预期结果是什么?由于字符串中没有时区或偏移量,因此需要确定要使用的偏移量。预期结果是什么?由于字符串中没有时区或偏移量,因此需要确定要使用的偏移量。