You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中@DateTimeFormat注解解析日期返回前一天如何解决

问题原因

你遇到的是时区不匹配导致的日期偏移问题:

  • @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)默认会将不带时区的日期字符串,按UTC时区解析为对应时间戳(也就是2021-10-12会被解析为UTC时区2021-10-12 00:00:00对应的时间戳)
  • java.util.Date本身不存储时区信息,调用toString()打印时会默认使用JVM的时区(你这里是MSK时区)渲染时间,UTC零点转成MSK时区就会出现日期偏移。

修复方案

方案1:全局配置日期解析时区(推荐)

如果所有日期参数都需要统一按指定时区解析,直接配置Spring的全局日期转换规则即可:

@Configuration
public class DateTimeConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setUseIsoFormat(true);
        // 按业务需要指定时区,比如莫斯科时区用"Europe/Moscow",国内业务用"Asia/Shanghai"
        registrar.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
        registrar.registerFormatters(registry);
    }
}

如果是JSON请求体参数,额外添加Jackson全局时区配置即可:
在application.yml中添加:

spring:
  jackson:
    time-zone: Europe/Moscow
    date-format: yyyy-MM-dd

方案2:单个参数单独处理

如果不想全局修改,只需要处理当前接口的参数,可以先接收字符串再手动按指定时区解析:

public static void exampleMethod(@ApiParam(value = "date", required = true) String dateStr) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    // 指定解析用的时区
    sdf.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
    Date date = sdf.parse(dateStr);
    // 后续业务逻辑
}

注意事项

不要使用"MSK"这类三个字母的时区标识,优先使用Europe/Moscow这类完整区域ID,避免不同JDK版本的兼容问题。

内容的提问来源于stack exchange,提问作者Evgenia Rubanova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:06:08