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

DateTimeFormatterBuilder在JUnit测试环境运行失败问题求助

问题分析与解决思路

这个问题的核心原因几乎可以肯定是Locale(区域设置)不一致导致的:

你用的MMM格式符对应月份的缩写(比如"May"),而DateTimeFormatter默认会使用JVM的默认Locale来解析这个缩写。Spring MVC运行环境中,可能已经通过配置或者服务器环境设置了英文相关的Locale(比如en_US),但你的测试环境JVM默认Locale是中文或者其他非英文区域,所以无法识别"May"这个英文月份缩写,导致解析失败。

而你单独断点执行LocalDateTime.parse("25-May-2018 11:10",DATE_TIME_FORMAT)能成功,大概率是因为你调试时IDE的Locale是英文的,和测试用例运行时的JVM Locale不一样。


具体解决方法

1. 显式为DateTimeFormatter指定Locale

最直接的解决方式是在创建Formatter时明确指定支持英文月份缩写的Locale,比如Locale.US,这样不管运行环境的默认Locale是什么,都能稳定解析:

修改你的日期格式化代码:

public void getTimeDifference(@RequestParam String startDate, @RequestParam String endDate) { 
    DateTimeFormatter DATE_TIME_FORMAT = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("dd-MMM-yyyy HH:mm")
            .toFormatter(Locale.US); // 显式指定Locale
    LocalDateTime.parse(startDate,DATE_TIME_FORMAT); 
    return messages; 
}

2. 验证测试环境的Locale设置

可以在测试方法中临时添加一行代码,确认测试环境的默认Locale:

@Test 
public void testFormat() throws Exception { 
    // 打印测试环境默认Locale
    System.out.println("测试环境默认Locale: " + Locale.getDefault());
    final String startDateFormatA = "25-May-2018 11:10"; 
    final String endDateFormatA = "25-May-2018 11:10"; 
    assertEquals("06:00", callDbController.getTimeDifference(startDateFormatA, endDateFormatA)[1]); 
}

如果输出的不是en_US或其他英文Locale,就坐实了Locale不一致的问题。

3. 统一Spring MVC与测试环境的Locale配置

如果你不想硬编码Locale,可以在Spring配置中统一设置应用的Locale,让测试环境加载相同的配置:

  • 比如在Spring Boot的application.properties中添加:
    spring.mvc.locale=en_US
    spring.mvc.locale-resolver=fixed
    
  • 测试环境确保加载相同的配置文件,这样两边Locale一致,解析逻辑就会统一。

内容的提问来源于stack exchange,提问作者Markus Schnee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:44