gpt4 book ai didi

java - 使用 DateTimeFormatterBuilder 解析非 UTC 日期

转载 作者:行者123 更新时间:2023-12-02 06:07:40 24 4
gpt4 key购买 nike

我正在尝试解析从 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 时,它会失败:

Cannot deserialize value of type java.time.OffsetDateTime from String "2017-09-19T10:39:36+1000": Failed to deserialize java.time.OffsetDateTime: (java.time.format.DateTimeParseException) Text '2017-09-19T10:39:36+1000' could not be parsed at index 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);

最佳答案

对于解析+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"))

关于java - 使用 DateTimeFormatterBuilder 解析非 UTC 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55931689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com