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

Java 日期時間處理大全:Date、Calendar、格式化與新舊 API 對比

     編輯:Java 程式設計入門

Java 日期時間處理大全:Date、Calendar、格式化與新舊 API 對比

java.util.Date 封裝日期時間,精確到毫秒。兩個建構子:Date()(當前時間)、Date(long millisec)(1970/1/1 起毫秒數)。

Date 常用方法

方法說明
after/before(Date)比較前後關係
compareTo(Date)比較大小(0 相等、負數較早、正數較晚)
equals(Object)判斷相等
getTime()取得 1970 起毫秒數
setTime(long)設定毫秒數
toString()轉字串(如 Mon May 04 09:51:52 CDT 2013)

取得當前時間

Date now = new Date();
System.out.println(now.toString());

日期比較三種方式

  1. getTime() 取毫秒數直接比較
  2. before()、after()、equals()
  3. compareTo()(實作 Comparable)

SimpleDateFormat:客製化格式化與解析

非執行緒安全,多執行緒環境需同步或使用 ThreadLocal。

常用格式字元

字元意義範例
y年2001 / 01
M月July / 07
d日10
H時 (0-23)22
h時 (1-12)10
m分30
s秒55
S毫秒234
E星期Tuesday
aAM/PMPM
z時區PST

範例:格式化輸出

Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
// Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

範例:解析字串為 Date

SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = "2007-12-01";
try {
    Date t = ft.parse(input);
    System.out.println(t); // Sat Dec 01 00:00:00 GMT 2007
} catch (ParseException e) {
    System.out.println("Unparseable: " + ft);
}

printf / String.format 格式化日期

使用 %t + 轉換字元:

轉換說明範例
%tc完整日期時間Mon May 04 09:51:52 CDT 2009
%tFISO 8601 日期2004-02-09
%tT24 小時時間18:05:19
%tr12 小時時間06:05:19 pm
%tY4 位年2004
%tm2 位月02
%td2 位日09
%tB月份全名February
%tb月份縮寫Feb
%tA星期全名Monday
%ta星期縮寫Mon

引數索引復用

System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
// Due date: February 09, 2004
// 或使用 < 標記復用前一引數:
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);

Thread.sleep 與時間測量

// 休眠 3 秒
Thread.sleep(1000 * 3);

// 測量時間間隔(毫秒)
long start = System.currentTimeMillis();
// ... 執行任務 ...
long end = System.currentTimeMillis();
System.out.println("耗時: " + (end - start) + " ms");

Calendar 抽象類別:日期運算利器

Calendar 為抽象類,透過 Calendar.getInstance() 取得具體實作(預設 GregorianCalendar)。

常用欄位常數

常數意義
YEAR年
MONTH月 (0-11,需 +1)
DATE / DAY_OF_MONTH日
HOUR_OF_DAY24 制時
MINUTE分
SECOND秒
DAY_OF_WEEK星期 (1=週日, 2=週一...)

設定與運算

Calendar c = Calendar.getInstance();
// 設定特定日期
c.set(2009, 5, 12); // 月份 0 基礎,6月 = 5
// 單一欄位設定
c.set(Calendar.DATE, 10);
// 加減運算(自動進位)
c.add(Calendar.DATE, 10);  // 10 天后
c.add(Calendar.MONTH, -1); // 1 月前

取得欄位值

int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int day = c.get(Calendar.DATE);
int hour = c.get(Calendar.HOUR_OF_DAY);
int dow = c.get(Calendar.DAY_OF_WEEK); // 1=週日

GregorianCalendar 具體實作

支援公曆(AD/BC 紀元),提供豐富建構子與工具方法:

  • isLeapYear(year):判斷閏年
  • getActualMaximum(MONTH):取得當月最大天數
  • roll(field, up):單一欄位增減(不影響較大欄位)

範例:顯示當前日期並判斷閏年

GregorianCalendar gc = new GregorianCalendar();
String[] months = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
System.out.println("Date: " + months[gc.get(Calendar.MONTH)] + " " + gc.get(Calendar.DATE) + " " + gc.get(Calendar.YEAR));
System.out.println("Time: " + gc.get(Calendar.HOUR) + ":" + gc.get(Calendar.MINUTE) + ":" + gc.get(Calendar.SECOND));
if (gc.isLeapYear(gc.get(Calendar.YEAR)))
    System.out.println("當前年份是閏年");
else
    System.out.println("當前年份不是閏年");

現代 Java (Java 8+) 建議:java.time 套件

舊 API (Date、Calendar) 存在可變性、非執行緒安全、設計混亂等問題。Java 8 引入 java.time:

  • LocalDate、LocalTime、LocalDateTime:不可變、無時區
  • ZonedDateTime、OffsetDateTime:帶時區
  • Instant:時間戳記
  • DateTimeFormatter:執行緒安全格式化
  • Period、Duration:日期/時間間隔

新專案強烈建議使用 java.time,舊代碼維護時可透過 toInstant()、Date.from() 互轉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved