如何修改AssertThat中LocalDateTime的输出时间格式为24小时制
如何将Hamcrest校验LocalDateTime时的12小时制输出改为24小时制
问题场景
使用Hamcrest的assertThat校验LocalDateTime时,错误信息里的时间默认是12小时制(带AM/PM标识),需要改为24小时制显示。
示例代码
LocalDateTime actualJobExecutionTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); ..... LocalDateTime expectedDateTime = LocalDateTime.now(); assertThat(actualJobExecutionTime, LocalDateTimeMatchers.after(expectedDateTime));
当前错误输出
java.lang.AssertionError: Expected: the date is after Mi., 02 Apr. 2025 08:28:16.482 AM but: date is Mo., 31 März 2025 09:33:35.000 AM
问题原因
问题根源在Hamcrest日期库自带的LocalDateTimeFormatter类中,它采用了12小时制的格式化规则:
package org.exparity.hamcrest.date.core.format; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import org.exparity.hamcrest.date.core.TemporalFormatter; public class LocalDateTimeFormatter implements TemporalFormatter<LocalDateTime> { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy hh:mm:ss.SSS a"); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy"); public LocalDateTimeFormatter() { } public String describe(LocalDateTime temporal) { return temporal.format(DATE_TIME_FORMAT); } public String describeDate(LocalDateTime temporal) { return temporal.format(DATE_FORMAT); } }
其中hh表示12小时制的小时数,a表示AM/PM标识,这两个配置导致了12小时制的输出。
解决方案
通过自定义格式化器和匹配器类,替换原有格式为24小时制:
1. 自定义匹配器类 CustomHamcrestDateMatcher
import org.exparity.hamcrest.date.core.DateMatcher; import org.exparity.hamcrest.date.core.IsAfter; import org.exparity.hamcrest.date.core.wrapper.LocalDateTimeWrapper; import java.time.LocalDateTime; public abstract class CustomHamcrestDateMatcher { public CustomHamcrestDateMatcher() { } public static DateMatcher<LocalDateTime> after(LocalDateTime date) { return new IsAfter<>(new LocalDateTimeWrapper(date), new CustomLocalDateTimeFormatter()); } }
2. 自定义格式化器类 CustomLocalDateTimeFormatter
import org.exparity.hamcrest.date.core.TemporalFormatter; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomLocalDateTimeFormatter implements TemporalFormatter<LocalDateTime> { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss"); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy"); public CustomLocalDateTimeFormatter() { } public String describe(LocalDateTime temporal) { return temporal.format(DATE_TIME_FORMAT); } public String describeDate(LocalDateTime temporal) { return temporal.format(DATE_FORMAT); } }
使用方式
将原代码中的LocalDateTimeMatchers.after替换为CustomHamcrestDateMatcher.after即可,此时错误信息会以24小时制显示时间。
内容的提问来源于stack exchange,提问作者Pavel Tsirulnikov
相关产品推荐
相关产品推荐

