我有一个 Rest 控制器,它有一个请求参数:
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") ZonedDateTime startDate
当我将数据发布到控制器时:
startDate=2020-12-02T18:07:33.251Z
但是,我收到400错误请求错误:
2020-12-02 18:20:32.428 WARN 26384 --- [nio-2000-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.ZonedDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime] for value '2020-12-02T18:07:33.251Z'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2020-12-02T18:07:33.251Z]]
您的日期时间字符串2020-12-02T18:07:33.251Z
已经采用ZonedDateTime#parse
使用的默认格式。
演示:
import java.time.ZonedDateTime;
public class Main {
public static void main(String args[]) {
String strDateTime = "2020-12-02T18:07:33.251Z";
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
System.out.println(zdt);
}
}
输出:
2020-12-02T18:07:33.251Z
这意味着您可以指定格式,DateTimeFormatter.ISO_ZONED_DATE_TIME
,这是ZonedDateTime#parse
使用的默认格式。将批注更改为
@RequestParam(required = false) @DateTimeFormat(pattern = DateTimeFormatter.ISO_ZONED_DATE_TIME) ZonedDateTime startDate
或
@RequestParam(required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime startDate
查看 Spring 文档页面以了解有关第二个选项的更多信息。
其他一些重要注意事项:
- 在任何情况下,都不要在
Z
两边加上一个引号,它代表Zulu
,表示UTC
处的日期时间(区域偏移量为+00:00
小时);相反,使用X
表示区域偏移量。
演示:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String strDateTime = "2020-12-02T18:07:33.251Z";
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));
System.out.println(zdt);
}
}
输出:
2020-12-02T18:07:33.251Z
检查日期时间格式化程序以了解更多信息。
- 此模式也适用于
SimpleDateFormat
。
演示:
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String args[]) throws ParseException {
String strDateTime = "2020-12-02T18:07:33.251Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
System.out.println(sdf.parse(strDateTime));
}
}
但是,java.util
的日期时间 API 及其格式化 APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API。