我有一个POST方法,该方法接受Header变量,该变量映射到Java端点中的java.time.OffsetDateTime
。但是,当我尝试以UTC格式(例如``2019-09-18T20:15:32.162Z'')或Post时间戳(例如1568835908)以Postman格式传递Header变量的日期时,我得到
"status": 400,
"error": "Bad Request",
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.OffsetDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@io.swagger.annotations.ApiParam @org.springframework.web.bind.annotation.RequestHeader java.time.OffsetDateTime] for value '1568835908'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [1568835908]
我知道我在邮递员标题中以错误的方式传递了日期。正确的方法是什么?
答案 0 :(得分:1)
根据链接到this post的this JavaScript library call,邮递员工具期望早期Internet协议中使用的过时格式的日期时间值。字符串看起来像这样:
2017年6月14日,星期三,格林尼治标准时间
该旧格式在RFC 1123和RFC 822中进行了定义。请注意,当今的现代协议改为采用ISO 8601,包括 java.time 类。
幸运的是,DateTimeFormatter
类具有一个常量,预定义了以下格式:DateTimeFormatter.RFC_1123_DATE_TIME
。
Instant instant = Instant.parse( "2019-09-18T20:15:32.162Z" ) ;
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
String output = odt.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;
请参阅此code run live at IdeOne.com。
输出:格林尼治标准时间2019年9月18日星期三
然后解析。
OffsetDateTime odt2 = OffsetDateTime.parse( output , DateTimeFormatter.RFC_1123_DATE_TIME ) ;
odt2.toString():2019-09-18T20:15:32Z
同样,这种格式很糟糕,应避免使用。它假设英语,并针对缩写/大写等假定某些文化规范。很难用机器解析。尽可能避免使用此格式,而应使用ISO 8601格式以文本形式传达日期时间值。但是,如果必须与尚未更新为现代协议和格式的旧代码进行互操作,则可以使用该预定义的格式程序生成和解析此类文本。
答案 1 :(得分:0)
通过在org.springframework.format.annotation.DateTimeFormat中添加@DateTimeFormat即方法参数声明中的@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)解决了该问题。