datetimeformat的自定义模式不起作用

6xfqseft  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(498)

我有一个rest控制器,它有一个请求参数:

  1. @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") ZonedDateTime startDate

当我将数据发布到控制器中时:

  1. startDate=2020-12-02T18:07:33.251Z

但是,我得到一个错误的400请求错误:

  1. 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]]
11dmarpk

11dmarpk1#

你的约会时间串, 2020-12-02T18:07:33.251Z 已使用的默认格式 ZonedDateTime#parse .
演示:

  1. import java.time.ZonedDateTime;
  2. public class Main {
  3. public static void main(String args[]) {
  4. String strDateTime = "2020-12-02T18:07:33.251Z";
  5. ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
  6. System.out.println(zdt);
  7. }
  8. }

输出:

  1. 2020-12-02T18:07:33.251Z

这意味着你可以指定格式, DateTimeFormatter.ISO_ZONED_DATE_TIME ,这是使用的默认格式 ZonedDateTime#parse . 将注解更改为

  1. @RequestParam(required = false) @DateTimeFormat(pattern = DateTimeFormatter.ISO_ZONED_DATE_TIME) ZonedDateTime startDate

  1. @RequestParam(required = false) @DateTimeFormat(iso = ISO.DATE_TIME) ZonedDateTime startDate

查看spring文档页面以了解关于第二个选项的更多信息。
其他一些重要注意事项:
在任何情况下,都不要随便引用一句话 Z 代表什么 Zulu 表示日期和时间 UTC (区域偏移为 +00:00 小时);相反,使用 X 用于区域偏移。
演示:

  1. import java.time.ZonedDateTime;
  2. import java.time.format.DateTimeFormatter;
  3. public class Main {
  4. public static void main(String args[]) {
  5. String strDateTime = "2020-12-02T18:07:33.251Z";
  6. ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));
  7. System.out.println(zdt);
  8. }
  9. }

输出:

  1. 2020-12-02T18:07:33.251Z

查看datetimeformatter了解更多信息。
此模式适用于 SimpleDateFormat 也。
演示:

  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. public class Main {
  4. public static void main(String args[]) throws ParseException {
  5. String strDateTime = "2020-12-02T18:07:33.251Z";
  6. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
  7. System.out.println(sdf.parse(strDateTime));
  8. }
  9. }

但是,api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。

展开查看全部

相关问题