【问题标题】:java DateTimeFormatterBuilder fails on testtime [duplicate]java DateTimeFormatterBuilder在测试时间失败[重复]
【发布时间】:2018-11-04 16:16:41
【问题描述】:

我有一个针对DateTimeFormatterBuilder 的简单 jUnit 测试。 在运行时它可以工作,当一些 String 出现在 Spring-MVC 处理程序 (@RequestParam) 上时

在测试时它以相同的String 值失败。

测试值:25-May-2018 11:10

待测方法:

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

测试方法:

@Test
public void testFormat() throws Exception {
    final String startDateFormatA = "25-May-2018 11:10";
    final String endDateFormatA = "25-May-2018 11:10";
    assertEquals("06:00", callDbController.getTimeDifference(startDateFormatA, endDateFormatA)[1]);
}

我的测试:在运行时我设置一个断点并在 Display-View 上测试它:

LocalDateTime.parse("25-May-2018 11:10",DATE_TIME_FORMAT)

在测试时使用相同的 spring-aplication-context 我在运行时做同样的事情,但它失败了。

有人有想法吗?

【问题讨论】:

  • 你说“它失败了”,但不要告诉我们异常细节。信息?堆栈跟踪?有什么事吗?
  • 除了你的问题,你为什么不直接解析成Instant?你真的知道Instant 是什么吗?它是UTC时间。 Instant result = formatter.parse(lo.time, Instant::from);.
  • 您的语言环境是US 吗?如果不是,则预期的月份名称可能已本地化,与英文名称不匹配。
  • 有关区域设置问题,请参阅 How to parse month full form string using DateFormat in Java?

标签: java junit format java-time


【解决方案1】:

月份名称是英文的,所以你最好在格式化程序中设置一个java.util.Locale

如果不设置,格式化程序将使用 JVM 默认语言环境。而且如果不是英文,可能会报错(而且不同的环境可能有不同的配置,所以最好设置locale而不是依赖JVM的默认值)。

只需 toFormatter(Locale.ENGLISH) 而不是 toFormatter() 就可以了。

【讨论】:

    【解决方案2】:

    您正在使用hh,即clock-hour-of-am-pm (1-12),而没有在日期字符串中添加 AM/PM 信息。

    相反,您应该使用 hour-of-day (0-23),例如:DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z");

    或者您可以在日期模式中添加a
    DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss a Z");

    并在日期字符串中传递 AM/PM 信息:

    "20/Mar/2019:00:00:01 AM +0100"


    编辑

    根据 cmets,问题也可能与您使用的语言环境有关,为了使用 en/US 语言环境,只需将语言环境传递给 ofPattern 方法:

     Locale locale = new Locale("en", "US");
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z", locale); 
    

    但您仍然需要将 clock-hour-of-am-pm (hh) 更正为 hour-of-day (HH)。

    【讨论】:

    • 对于 OP 输入,这会引发相同的异常。
    • @Glains,不,我已经检查过您是否将模式更改为 dd/MMM/yyyy:HH:mm:ss Z 我正在使用 OP 提供的输入获得一个有效的瞬间。
    • 问题可能与 OP 区域设置不是美国有关。然后Mar 无效,因为它需要本地化月份名称。设置区域设置或提供正确的本地化月份名称将修复它。
    • @Zabuza 我认为你是对的,我用另一个语言环境(es/ES)进行了测试,然后我能够重现 OP 的错误。所以提到 en/US 的语言环境就修复了它。
    • @Zabuza 谢谢,你是对的。我必须将语言环境设置为美国才能使其工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2013-05-04
    • 1970-01-01
    • 2021-12-27
    • 2015-09-05
    • 2022-06-28
    相关资源
    最近更新 更多