java.util.Locale 封裝語言 (ISO-639) 和國家 (ISO-3166) 代碼:
Locale localeEN = new Locale("en", "US"); // 英語/美國
Locale localeFR = Locale.FRANCE; // 法語/法國
// 顯示名稱可本地化
localeEN.getDisplayName(localeFR); // "anglais (États-Unis)"
DateFormat.getDateTimeInstance(style, style, locale) 獲取特定風格的格式化器:
DateFormat dfFR = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.FRANCE);
DateFormat dfUS = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
System.out.println(dfFR.format(new Date())); // vendredi 5 octobre 2001 21 h 05 GMT-04:00
System.out.println(dfUS.format(new Date())); // Friday, October 5, 2001 9:05:54 PM EDT
TimeZone 提供相對 GMT 的毫秒偏移量與夏令時規則:
TimeZone tzDefault = TimeZone.getDefault(); // 系統時區
TimeZone tzLondon = TimeZone.getTimeZone("Europe/London");
TimeZone tzParis = TimeZone.getTimeZone("Europe/Paris");
tzDefault.getRawOffset(); // -18000000 (毫秒)
tzDefault.useDaylightTime(); // true
結合 DateFormat.setTimeZone() 與 TimeZone.getDisplayName(locale) 實現跨時區、多語言顯示:
DateFormat dfEN = DateFormat.getDateTimeInstance(FULL, FULL, Locale.US);
DateFormat dfFR = DateFormat.getDateTimeInstance(FULL, FULL, Locale.FRANCE);
Date now = new Date();
dfEN.setTimeZone(tzMiami);
System.out.println(dfEN.format(now)); // Friday, October 5, 2001 10:28:02 PM EDT
dfEN.setTimeZone(tzParis);
System.out.println(dfEN.format(now)); // Saturday, October 6, 2001 4:28:02 AM CEST
dfFR.setTimeZone(tzParis);
System.out.println(dfFR.format(now)); // samedi 6 octobre 2001 04 h 28 GMT+02:00
java.sql.Date 繼承 java.util.Date,配合 PreparedStatement 實現與 Oracle DATE 類型映射:
// 存入
java.util.Date utilDate = new Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
ps.setDate(1, sqlDate); // JDBC 驅動自動轉換為 Oracle DATE
// 讀取
ResultSet rs = ps.executeQuery("SELECT LAST_HIT FROM LAST_ACCESS");
if (rs.next()) {
java.sql.Date dbDate = rs.getDate("LAST_HIT"); // 自動轉換為 java.sql.Date
}
注意:java.sql.Date 僅保留日期部分(時分秒歸零),若需完整時間戳請使用 java.sql.Timestamp。