如何从给定的 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.
您注意到所有可能的格式都至少包括小时、分钟和偏移量。
那么该怎么办呢?两个建议,其中一个可能适用于您的情况:
- 将
OffsetDateTime
设置为 UTC 中一天的开始。
- 将
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
我目前收到 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.
您注意到所有可能的格式都至少包括小时、分钟和偏移量。
那么该怎么办呢?两个建议,其中一个可能适用于您的情况:
- 将
OffsetDateTime
设置为 UTC 中一天的开始。 - 将
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