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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:15:00