跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 时间差计算的两种常用实现方式

Java 时间差计算在业务开发中很常见,主要涉及相对日期推算和绝对时间差统计。本文通过 Calendar 类演示如何基于当前时间增加天数或周数,同时展示利用 SimpleDateFormat 解析固定日期并计算毫秒差、天差及小时差的方法。代码包含完整的导入与逻辑封装,适合快速查阅参考。注意生产环境推荐优先使用 Java 8 引入的 java.time API 以避免时区问题。

孤勇者发布于 2021/10/12更新于 2026/10/19154 浏览
Java 时间差计算的两种常用实现方式

在 Java 开发中,处理时间差异是高频需求。无论是计算项目周期、会员有效期还是日志分析,准确的时间差计算都至关重要。虽然 Java 8 之后引入了 java.time API,但在维护旧系统或特定场景下,传统的 Calendar 和 Date 类依然广泛使用。这里分享两种经典实现方案,代码可直接运行参考。

场景一:基于当前时间的相对推算

很多时候我们需要知道 N 天后是什么时间,或者 M 周后的日期。利用 Calendar 的 set 方法可以方便地修改日期字段。

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

public class TimeDiffDemo {
    public static void main(String[] args) {
        // 演示增加天数
        Calendar now = Calendar.getInstance();
        System.out.println("当前时间:" + new Date());
        
        int daysToAdd = 280;
        now.set(Calendar.DATE, now.get(Calendar.DATE) + daysToAdd);
        System.out.println(daysToAdd + "天后的时间:" + now.getTime());
        
        // 演示增加周数
        Calendar nextMonth = Calendar.getInstance();
        int weeksToAdd = 37;
        nextMonth.set(Calendar.DATE, nextMonth.get(Calendar.DATE) + (weeksToAdd * 7));
        System.out.println(weeksToAdd + "周后的时间:" + nextMonth.getTime());
    }
}

这里要注意,Calendar 是基于本地时区的,如果涉及跨时区业务,建议后续迁移到 ZonedDateTime。另外,直接操作 DATE 字段在某些极端情况下(如月末)可能会自动进位,通常这正是我们想要的行为。

场景二:两个固定日期的差值计算

如果是比较两个历史时间点,比如从 2018-03-01 到 2018-03-12 到底隔了多少天、多少小时,核心思路是将时间转换为毫秒数进行减法运算。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeDiffDemo {
    public static void calculateTimeDifferenceBySimpleDateFormat() throws ParseException {
        SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        
        // 定义起止时间
        Date fromDate = simpleFormat.parse("2018-03-01 12:00");
        Date toDate = simpleFormat.parse("2018-03-12 12:00");
        
        long fromMillis = fromDate.getTime();
        long toMillis = toDate.getTime();
        
        // 计算天数差
        int days = (int) ((toMillis - fromMillis) / (1000 * 60 * 60 * 24));
        System.out.println("两个时间之间的天数差为:" + days);
        
        // 计算小时差
        int hours = (int) ((toMillis - fromMillis) / (1000 * 60 * 60));
        System.out.println("两个时间之间的小时差为:" + hours);
        
        // 计算分钟差
        int minutes = (int) ((toMillis - fromMillis) / (1000 * 60));
        System.out.println("两个时间之间的分钟差为:" + minutes);
    }
}

注意这里使用了 HH 而不是 hh,前者代表 0-23 小时,后者代表 1-12 小时且通常需要配合 AM/PM 标识,避免解析歧义。实际运行时会发现,只要起止时间格式严格一致,毫秒相减再除以常量即可得到结果。整数除法会自动向下取整,如果需要更精确的小数,记得将除数改为浮点数。

写在最后

上述代码保留了最基础的逻辑,适合快速查阅。但作为资深工程师的建议是,新项目请优先使用 java.time 包下的 LocalDateTime 和 Duration,它们不可变且线程安全,能避免很多由 Date 和 Calendar 带来的坑。

目录

  1. 场景一:基于当前时间的相对推算
  2. 场景二:两个固定日期的差值计算
  3. 写在最后

更多推荐文章

查看全部
  • ChatGPT:运用 Prompt 技巧优化文章润色全过程
  • Java 后端实习复盘:企业级开发流程与核心模块解析
  • 深度学习模型优化策略与实战调参
  • 大模型应用开发入门:从原理到 LangChain 实战
  • 8 篇必读的大模型论文精选
  • MiniMax 发布全球首份大模型年报,预判 2026 三大超级 PMF
  • 基于 SpringBoot + Vue 的时间管理系统设计与实现
  • Whisper 语音识别教育场景:课堂录音自动转文字方案
  • 基于 Anything-LLM 的 Midjourney 作品集自动归档方案
  • AI 在医疗健康领域的应用开发与实践
  • 如何利用 AI 自动生成自动化脚本
  • Linux 基础开发工具:Git 版本控制与 GDB 调试器详解
  • Whisper OpenAI 开源语音识别工具安装与使用指南
  • OpenRouter 详解:全球 AI 模型聚合平台与免费资源指南
  • Windows 系统安装 Microsoft Visual C++ Build Tools 详解
  • MySQL 主从复制与高可用架构实战
  • PostgreSQL 安装教程及初始使用
  • 前端国际化实现指南:React 与 Vue 最佳实践
  • 点微同城系统 34.7 版本源码及小程序前后端方案
  • Linux 基础指令实战:压缩解压与权限管理

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online