我正在尝试解析从Bitbucket event payload收到的以下日期字符串:
2017-09-19T10:39:36+1000
当输入日期的偏移量为+0000
时,它可以工作,但是+1000
不能。
这是一个稍微不标准的日期字符串(从JDK的角度来看),因为它的偏移量中没有冒号。因此,我做了一个自定义的DateTimeFormatter,它在偏移量为+0000
时有效:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendOffset("+HHMM", "+0000")
.optionalEnd()
.toFormatter();
但是,当偏移量如上所述为+1000
时,它将失败并显示:
无法从字符串“ 2017-09-19T10:39:36 + 1000”反序列化类型
java.time.OffsetDateTime
的值:无法反序列化java.time.OffsetDateTime:(java.time.format.DateTimeParseException)文本'2017 -09-19T10:39:36 + 1000'无法在索引19处解析
如果接收到的日期字符串使用偏移量+0000
,则它将起作用。如何解析所有时区?
这用于构造JavaTimeModule的实例,该实例用于通知ObjectMapper输入的日期格式:
JavaTimeModule javaTimeModule = new JavaTimeModule();
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendOffset("+HHMM", "+0000")
.optionalEnd()
.toFormatter();
// This also fails:
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssx");
LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(formatter);
javaTimeModule.addDeserializer(LocalDateTime.class, deserializer);
// MAPPER is an instance of com.fasterxml.jackson.databind.ObjectMapper
MAPPER.registerModule(javaTimeModule);
答案 0 :(得分:0)
要解析+1000,下面的代码将起作用。
package com.iamninad.qa;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeFormat {
public static void main(String[] args) throws IOException {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
System.out.println(dateTimeFormatter.parse("2017-09-19T10:39:36+1000"));
LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(dateTimeFormatter);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, deserializer);
ObjectMapper MAPPER = new ObjectMapper();
MAPPER.registerModule(javaTimeModule);
// serialize object
String s = MAPPER.writeValueAsString(new Data());
System.out.println(s);
// deserialize object
String json = "{\"date\":\"2017-09-19T10:39:36-0830\"}";
String json1 = "{\"date\":\"2017-09-19T10:39:36+1000\"}";
Data data = MAPPER.readValue(json, Data.class);
System.out.println(data.toString());
Data data1 = MAPPER.readValue(json1, Data.class);
System.out.println(data1.toString());
}
}
class Data {
// Just to generate a sample data
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
private LocalDateTime date = LocalDateTime.parse("2017-09-19T10:39:36+1000", dateTimeFormatter);
public LocalDateTime getDate() {
return date;
}
public void setDate(LocalDateTime date) {
this.date = date;
}
@Override
public String toString() {
return "Data{" +
"date=" + date +
'}';
}
}
如果要解析+10:00,则对格式为+10:00或模式yyyy-MM-dd'T'HH:mm:ssXXX
的字段使用ISO_OFFSET_DATE_TIME,它将采用任何一种格式。我想这个问题在jdk 9中已经解决
OffsetDateTime.parse("2017-09-19T10:39:36+10:00")
也只能以一种格式(即+10:00而不是+1000)解析时间,您需要为parse
方法指定格式化程序
OffsetDateTime.parse("2017-09-19T10:39:36+1000",DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZZZ"))
答案 1 :(得分:0)
Z
模式可以解析该偏移量。您是否尝试过使用此功能?
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(ISO_LOCAL_DATE_TIME)
.appendPattern("Z")
.toFormatter();
它可以解析+0000
和+1000
。