gpt4 book ai didi

Java - 序列化/反序列化日期时出错

转载 作者:行者123 更新时间:2023-12-02 01:37:59 26 4
gpt4 key购买 nike

我无法弄清楚这个日期格式是什么:2019-02-28T12:17:46.279+0000。我尝试了不同的日期格式来获得这个结果,但没有任何效果。最接近的模式是:yyyy-MM-dd'T'HH:mm:ss.SSSZ但是使用此模式输出如下:2019-02-28T12:17:46.279-0000 (- 位于秒后,而不是 +)

我得到这个异常:

Caused by: java.lang.IllegalArgumentException: 2019-02-28T12:17:46.279+0000
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.skip(XMLGregorianCalendarImpl.java:2932)
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2898)
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl.<init>(XMLGregorianCalendarImpl.java:478)
at org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(DatatypeFactoryImpl.java:230)
at __redirected.__DatatypeFactory.newXMLGregorianCalendar(__DatatypeFactory.java:132)
at javax.xml.bind.DatatypeConverterImpl.parseDate(DatatypeConverterImpl.java:519)
at javax.xml.bind.DatatypeConverter.parseDate(DatatypeConverter.java:431)
at eu.europa.ec.my.custom.package.model.mapper.XsdDateTimeConverter.unmarshal(XsdDateTimeConverter.java:23)

我的 XsdDateTimeConverter 类如下所示:

public class XsdDateTimeConverter {

public static Date unmarshal(String dateTime) {
return DatatypeConverter.parseDate(dateTime).getTime();
}

public static String marshalDate(Date date) {
final Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return DatatypeConverter.printDate(calendar);
}

public static String marshalDateTime(Date dateTime) {
final Calendar calendar = Calendar.getInstance();
calendar.setTime(dateTime);
return DatatypeConverter.printDateTime(calendar);
}
}

我的 postgres 数据库中解析的日期如下所示:

move_timestamp timestamp(6) with time zone

2019-02-28 12:17:46.279+00

在我的休息方法中,我像这样使用ObjectMapper

MyCustomResponseDto responseDto = customService.getCustomResponseDto(query);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
String strValue = mapper.writeValueAsString(responseDto);
return Response.ok(strValue).build();

我想我真正想要的是这次约会的正确模式是什么。我可以进入这个页面:http://www.sdfonlinetester.info/并输入我的模式(例如yyyy-MM-dd'T'HH:mm:ss.SSSZ),它会为您提供该模式的实际日期输出。我需要相反的方式。我想输入我的日期,它会给我正确的模式。

最佳答案

tl;博士

OffsetDateTime.parse( 
"2019-02-28T12:17:46.279+0000" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" , Locale.ROOT )
)

java.time

您正在使用糟糕的 Calendar 类,该类多年前已被 java.time 类取代。

ISO 8601

您的输入字符串符合标准 ISO 8601格式,专为人类可读的机器可解析的日期时间值的文本表示形式而设计。这是一件好事。

java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。

偏移日期时间

应该能够简单地使用OffsetDateTime进行解析。

OffsetDateTime.parse( "2019-02-28T12:17:46.279+0000" )

…但不幸的是,可选的冒号字符在偏移量 (+00:00) 中被省略是一个问题。 OffsetDateTime 类有一个小错误,它拒绝在没有该字符的情况下进行解析。该错误已讨论herehere

ISO 8601 标准允许不使用冒号,但实际上您应该始终包含它。 OffsetDateTime 类并不孤单。我见过其他库在缺少冒号或填充零时崩溃。我建议要求您的数据发布者使用完整的 ISO 8601 格式,包括冒号。

解决 OffsetDateTime 错误的方法是显式定义 DateTimeFormatter

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" , Locale.ROOT ) ;

然后解析。

String input = "2019-02-28T12:17:46.279+0000" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;

要生成完整标准 ISO 8601 格式的文本,只需调用 toString

String output = odt.toString() ;

查看此code run live at IdeOne.com .

output: 2019-02-28T12:17:46.279Z

末尾的Z表示UTC,即+0000+00:00。发音为“祖鲁”。非常常用,比数字偏移更容易立即读取。

如果您希望输出格式与输入相同,请使用相同的 DateTimeFormatter

String output = odt.format( f ) ;

关于Java - 序列化/反序列化日期时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54926253/

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