如何从给定的 OffsetDatetime 和 return 获取 LocalDate(yyyy-MM-dd) 格式作为没有区域偏移的 OffsetDatetime?

How to get LocalDate(yyyy-MM-dd) format from given OffsetDatetime and return as OffsetDatetime without zone offset?

我目前收到 java.time.OffsetDateTime 偏移量如下:

2021-06-05T18:29:31Z

2021-06-05T18:29:38.723Z

是否可以将其转换为 LocalDate 格式 (yyyy-MM-dd) 和 return 为 java.time.OffsetDateTime?

我用 DateTimeFormatter 尝试了以下操作,但没有成功。

        String offsetDateTimeString = offsetDateTime.toString();

        DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd")
                .toFormatter();
        return OffsetDateTime.parse(offsetDateTimeString, dateTimeFormatter)

如果无法转换为 yyyy-MM-dd 格式,则也无法转换为无区域偏移的格式。

        String offsetDateTimeString = offsetDateTime.toString();
        DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                .toFormatter();

OffsetDateTime offsetDateTime = OffsetDateTime.parse(offsetDateTimeString, dateTimeFormatter);

当 运行 此代码时我得到 DateTimeParseException

java.time.format.DateTimeParseException: Text '2021-06-05T18:39:51.578Z' could not be parsed, unparsed text found at index 19

我需要return OffsetDateTime 格式的给定日期为“yyyy-MM-dd”或“yyyy-MM-dd'T'HH:mm:ss”。

不,你不能有没有偏移量的 OffsetDateTime 也不能没有一天中的时间。顾名思义,OffsetDateTime 必须包含日期、时间和与 UTC 或 GMT 的偏移量。你问的有点像要求一个没有负号的负数或 boolean 的值 t 而不是 true.

另外 OffsetDateTime 不能有格式。你可以有任何你喜欢的格式,但不能在日期时间对象中(也不能在 LocalDate 中),只能在 String 中。打印 OffsetDateTime 时看到的是调用其 toString 方法的结果。该方法的文档说:

The output will be one of the following ISO-8601 formats:

  • uuuu-MM-dd'T'HH:mmXXXXX
  • uuuu-MM-dd'T'HH:mm:ssXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSXXXXX

The format used will be the shortest that outputs the full value of the time where the omitted parts are implied to be zero.

您注意到所有可能的格式都至少包括小时、分钟和偏移量。

那么该怎么办呢?两个建议,其中一个可能适用于您的情况:

  1. OffsetDateTime 设置为 UTC 中一天的开始。
  2. OffsetDateTime 设置为 JVM 默认时区中一天的开始。

在代码中:UTC 中一天的开始(总是 00:00):

    // Example received value
    OffsetDateTime offsetDateTime = OffsetDateTime.of(
            2021, 6, 5, 18, 29, 38, 723_000_000, ZoneOffset.UTC);
    
    OffsetDateTime dateOnly = offsetDateTime
            .withOffsetSameInstant(ZoneOffset.UTC)
            .truncatedTo(ChronoUnit.DAYS);
    System.out.println(dateOnly);

输出:

2021-06-05T00:00Z

默认时区中一天的开始(通常也是 00:00):

    OffsetDateTime dateOnly = offsetDateTime
            .atZoneSameInstant(ZoneId.systemDefault())
            .truncatedTo(ChronoUnit.DAYS)
            .toOffsetDateTime();

当我在Asia/Omsk时区运行时,输出为:

2021-06-06T00:00+06:00

Link

Documentation of OffsetDateTime.toString()