datetimeformat的自定义模式不起作用

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

我有一个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]]
11dmarpk

11dmarpk1#

你的约会时间串, 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

查看datetimeformatter了解更多信息。
此模式适用于 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));
    }
}

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

相关问题