Date、Calendar 對象。System.currentTimeMillis()、Date.getTime()、Calendar.getTimeInMillis()。兩者可互轉,實際開發常「存相對、顯絕對、算相對」。
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
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
抽象類,工廠方法獲取實例(通常為 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() | 轉 Date | Date d = c.getTime() |
setTime(Date) | Date 轉 Calendar | c.setTime(d) |
getTimeInMillis() | 轉毫秒數 | long ms = c.getTimeInMillis() |
setTimeInMillis(ms) | 毫秒數轉 Calendar | c.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();
}
}
舊 API 缺陷:可變性、線程不安全、月份 0 基、設計混亂。JDK 8 引入 java.time 包:
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"));