我正在使用jira
api,并且在其中一个请求中,我获得了具有日期字段的响应,格式如下:2022-10-26T09:34:00.000+0000
。我需要将其转换为LocalDate
,但我不知道如何使用这种奇怪的格式。以下是我尝试过的一些格式:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
DateTimeFormatter.ISO_LOCAL_DATE_TIME
但两者都不能反序列化日期末尾的+
符号。
Text '2022-10-27T09:34:00.000+0000' could not be parsed, unparsed text found at index 24
您必须添加时区:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
签出文档https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
错误消息告诉您,您的DateTimeFormatter
无法解析String
末尾的+0000
的区域偏移量。这是因为DateTimeFormatter.ISO_LOCAL_DATE_TIME
只是不期望一个偏移量,它应该只解析
就是这样!没有抵消!不带!.
但这也意味着它可以完美地解析所有东西,直到你的例子中的这个偏移量!
然而,String
是几乎格式化为OffsetDateTime
,但不幸的是,它的ISO格式化程序期望一个偏移量,其中小时和分钟由冒号分隔,例如+00:00
,而您的String
没有。
java.time
允许您在现有格式化程序的基础上构建自定义格式化程序。这就是为什么我在上面提到除了偏移量之外的所有内容都可以使用DateTimeFormatter.ISO_LOCAL_DATE_TIME
进行解析。你可以取那个并附加一个offset-x模式,然后解析你的未分隔偏移量。让我们称它为扩展一个现有的格式化器,这里有一个例子:
public static void main(String[] args) {
// your example String
String someTimes = "2022-10-26T09:34:00.000+0000";
// build a suitable formatter by extending an ISO-formatter
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("xxxx")
.toFormatter(Locale.ENGLISH);
// then parse
LocalDate localDate = LocalDate.parse(someTimes, dtf);
// and print
System.out.println(localDate);
}
输出:2022-10-26
创建一个带有Locale
的格式化器总是一个好主意,但在大多数情况下,如果只解析数值,没有Locale
的格式化器可能就足够了。这也适用于DateTimeFormatter.ofPattern(String, Locale)
。