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

Java 時間日期處理全攻略:Date、Calendar 與實戰案例

     編輯:Java 相關知識

時間表示的兩種形式

  • 絕對時間:直觀可讀(如 2024-06-15 14:30:00),適合顯示、存儲,難以直接運算。對應 Date、Calendar 對象。
  • 相對時間:長整型毫秒數,基準為 GMT 1970-01-01 00:00:00。前為正,後為負。極易運算(相減得差值),對應 System.currentTimeMillis()、Date.getTime()、Calendar.getTimeInMillis()。

兩者可互轉,實際開發常「存相對、顯絕對、算相對」。

Date 類(JDK 1.0,部分過時)

構造與基本用法

Date now = new Date();                    // 當前時間
Date d = new Date(2024-1900, 6-1, 15);    // 年-1900,月-1
System.out.println(d);                    // Sun Jun 15 14:30:00 CST 2024

字段獲取(均已過時,建議改用 Calendar)

int year = d.getYear() + 1900;
int month = d.getMonth() + 1;
int date = d.getDate();
int hour = d.getHours();
int min = d.getMinutes();
int sec = d.getSeconds();
int day = d.getDay(); // 0=週日, 1=週一...

相對時間互轉

long ms = d.getTime();        // Date → 毫秒數
Date d2 = new Date(ms);       // 毫秒數 → Date

Calendar 類(JDK 1.1+ 推薦)

抽象類,工廠方法獲取實例(通常為 GregorianCalendar)。

獲取與設置

Calendar c = Calendar.getInstance();    // 當前時間
c.set(2024, 6-1, 15);                   // 年、月-1、日
c.set(Calendar.HOUR_OF_DAY, 14);        // 24制小時
c.set(Calendar.MINUTE, 30);
c.set(Calendar.SECOND, 0);

// 獲取字段
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int day = c.get(Calendar.DAY_OF_WEEK);  // 1=週日, 2=週一...

核心進階方法

方法用途範例
add(field, amount)字段增減(自動進位)c.add(Calendar.DATE, 100) // 100天後
after/before(when)時間比較c1.after(c2)
getTime()轉 DateDate d = c.getTime()
setTime(Date)Date 轉 Calendarc.setTime(d)
getTimeInMillis()轉毫秒數long ms = c.getTimeInMillis()
setTimeInMillis(ms)毫秒數轉 Calendarc.setTimeInMillis(ms)
getActualMaximum(DATE)當月最大天數28/29/30/31

實戰案例

案例一:計算兩日期相差天數

import java.util.*;

public class DateDiff {
    public static void main(String[] args) {
        Calendar c1 = Calendar.getInstance();
        c1.set(2024, 3-1, 11);  // 2024-03-11
        Calendar c2 = Calendar.getInstance();
        c2.set(2025, 4-1, 1);   // 2025-04-01
        
        long diff = c2.getTimeInMillis() - c1.getTimeInMillis();
        long days = diff / (24 * 60 * 60 * 1000);
        System.out.println("相差 " + days + " 天");  // 386
    }
}

案例二:打印當月日曆

import java.util.*;

public class MonthCalendar {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DATE, 1);                 // 設為 1 號
        int startDay = c.get(Calendar.DAY_OF_WEEK); // 1=週日
        int maxDay = c.getActualMaximum(Calendar.DATE);
        
        System.out.println("日 一 二 三 四 五 六");
        
        // 1 號前空格
        for (int i = 1; i < startDay; i++) System.out.print("   ");
        
        for (int d = 1; d <= maxDay; d++) {
            System.out.printf("%2d ", d);
            if ((startDay + d - 1) % 7 == 0) System.out.println();
        }
        System.out.println();
    }
}

現代化替代:java.time (JDK 8+)

舊 API 缺陷:可變性、線程不安全、月份 0 基、設計混亂。JDK 8 引入 java.time 包:

  • LocalDate/LocalTime/LocalDateTime:不可變,無時區
  • ZonedDateTime/OffsetDateTime:帶時區
  • Instant:時間戳(毫秒/納秒)
  • Duration/Period:時間間隔
  • DateTimeFormatter:線程安全格式化

常用範例

LocalDate today = LocalDate.now();
LocalDate specific = LocalDate.of(2024, 6, 15);
LocalDateTime now = LocalDateTime.now();
long days = ChronoUnit.DAYS.between(today, specific);
String formatted = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved