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
相关产品推荐
相关产品推荐

