首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Calendar 時間差計算工具類:毫秒級精度、天/時/分/秒自動換算

     編輯:Java 綜合教學

Java Calendar 時間差計算工具類

基於 java.util.Calendar 實現兩時間點差值計算,自動換算為「天/時/分/秒」人類可讀格式。

核心代碼

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TimeDiffCalculator {
    public static void main(String[] args) {
        // 目標時間:2016-01-01 00:00:00
        Calendar target = Calendar.getInstance();
        target.set(2016, Calendar.JANUARY, 1, 0, 0, 0);
        target.set(Calendar.MILLISECOND, 0);

        Calendar now = Calendar.getInstance();

        long diffMs = now.getTimeInMillis() - target.getTimeInMillis(); // 毫秒差
        if (diffMs < 0) {
            System.out.println("目標時間在未來");
            return;
        }

        long diffSec = diffMs / 1000;
        long diffMin = diffSec / 60;
        long diffHour = diffMin / 60;
        long diffDay = diffHour / 24;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當前時間:" + sdf.format(now.getTime()));
        System.out.println("目標時間:" + sdf.format(target.getTime()));
        System.out.printf("時間差:%d天 %d時 %d分 %d秒%n",
                diffDay, diffHour % 24, diffMin % 60, diffSec % 60);
    }
}

關鍵點解析

  1. Calendar.MONTH 從 0 開始(0=1月),設定月份時需 month - 1 或直接用常量 Calendar.JANUARY。
  2. getTimeInMillis() 返回 UTC 毫秒時間戳,相減得到精確毫秒差。
  3. 換算鏈:毫秒 → 秒 (/1000) → 分 (/60) → 時 (/60) → 天 (/24)。
  4. 取模運算提取各級單位:hour % 24、min % 60、sec % 60。
  5. 線程安全:SimpleDateFormat **非線程安全**,多線程環境請用 ThreadLocal 或 JDK 8+ DateTimeFormatter。

現代替代方案(JDK 8+ 強烈推薦)

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class ModernTimeDiff {
    public static void main(String[] args) {
        LocalDateTime target = LocalDateTime.of(2016, 1, 1, 0, 0);
        LocalDateTime now = LocalDateTime.now();

        long days = ChronoUnit.DAYS.between(target, now);
        long hours = ChronoUnit.HOURS.between(target, now) % 24;
        long minutes = ChronoUnit.MINUTES.between(target, now) % 60;
        long seconds = ChronoUnit.SECONDS.between(target, now) % 60;

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("當前:" + now.format(fmt));
        System.out.println("目標:" + target.format(fmt));
        System.out.printf("差值:%d天 %d時 %d分 %d秒%n", days, hours, minutes, seconds);

        // 更豐富:Duration / Period
        Duration d = Duration.between(target, now);
        System.out.println("總秒數:" + d.getSeconds());
        System.out.println("總天數:" + d.toDays());
    }
}
  • java.time 包不可變、線程安全、API 豐富(Duration、Period、ChronoUnit)。
  • 生產項目**全面遷移至 java.time**,Calendar/Date 僅維舊代碼兼容。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved