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

如何在Java中使用Calendar类比较日期(忽略时间部分)?

更简洁的日期比较方案

你的需求是对比两个Date对象的日期部分(忽略时间),原代码逻辑没问题,但确实有更简洁的实现方式,分两种场景给出方案:

一、Java 8及以上版本(推荐)

Java 8引入的java.time包(新日期API)设计更合理,线程安全,且专门有LocalDate类只处理日期信息,直接用它来对比最简洁:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.HashMap;

public Boolean a0160(HashMap<String, Object> params) {
    Date now = new Date();
    Date accessRecord = userMapper.a0170(params);

    // 将now减去1小时后转成LocalDate(仅保留年/月/日)
    LocalDate oneHourBeforeDate = now.toInstant()
                                    .minus(1, ChronoUnit.HOURS)
                                    .atZone(ZoneId.systemDefault())
                                    .toLocalDate();
    // 将accessRecord转成LocalDate
    LocalDate accessRecordDate = accessRecord.toInstant()
                                            .atZone(ZoneId.systemDefault())
                                            .toLocalDate();

    // 直接对比两个LocalDate是否相等
    return oneHourBeforeDate.equals(accessRecordDate);
}

说明:

  • LocalDate本身只存储年、月、日信息,equals()方法会直接对比这三个维度,完全符合你的需求;
  • 转换时指定时区(示例用系统默认时区,也可以显式指定比如ZoneId.of("Asia/Shanghai")),避免时区差异导致的日期判断错误;
  • 代码结构清晰,没有冗余变量,可读性远高于原实现。

二、Java 8以下版本(兼容旧代码)

如果项目还在使用Java 8之前的版本,可以简化原有Calendar的用法,通过清零时间部分后对比时间戳来实现:

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

public Boolean a0160(HashMap<String, Object> params) {
    Date now = new Date();
    Date accessRecord = userMapper.a0170(params);

    Calendar calOneHourBefore = Calendar.getInstance();
    calOneHourBefore.setTime(now);
    calOneHourBefore.add(Calendar.HOUR, -1);
    // 清零时间部分:时、分、秒、毫秒都设为0,只保留日期信息
    calOneHourBefore.set(Calendar.HOUR_OF_DAY, 0);
    calOneHourBefore.set(Calendar.MINUTE, 0);
    calOneHourBefore.set(Calendar.SECOND, 0);
    calOneHourBefore.set(Calendar.MILLISECOND, 0);

    Calendar calAccessRecord = Calendar.getInstance();
    calAccessRecord.setTime(accessRecord);
    calAccessRecord.set(Calendar.HOUR_OF_DAY, 0);
    calAccessRecord.set(Calendar.MINUTE, 0);
    calAccessRecord.set(Calendar.SECOND, 0);
    calAccessRecord.set(Calendar.MILLISECOND, 0);

    // 对比两个Calendar的时间戳(此时时间戳仅代表当天0点)
    return calOneHourBefore.getTimeInMillis() == calAccessRecord.getTimeInMillis();
}

说明:

  • 把两个Calendar的时间部分全部清零后,它们的时间戳就对应当天的00:00:00.000,直接对比时间戳即可判断是否为同一天;
  • 省去了原代码中单独提取年、月、日变量的步骤,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:23