日期时间格式的自定义模式不起作用



我有一个 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 文档页面以了解有关第二个选项的更多信息。


其他一些重要注意事项:

  1. 在任何情况下,都不要在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

检查日期时间格式化程序以了解更多信息。

  1. 此模式也适用于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。

相关内容

  • 没有找到相关文章