注意:原文內容異常,混雜了 VBScript 文件搜索代碼,與標題「Java 獲取日期的方法」完全無關。本文重新撰寫,提供 Java 日期時間處理的現代、標準、完整指南,涵蓋 Java 8+ `java.time` 包(首選)、舊 `Date/Calendar` 互轉、格式化、計算、數據庫映射等核心場景。
Java 8 引入 JSR-310,提供不可變、線程安全、API 清晰的日期時間類,完全替代 `Date`、`Calendar`、`SimpleDateFormat`。
| 類 | 用途 | 示例 |
|---|---|---|
| LocalDate | 僅日期(年月日) | 2024-03-15 |
| LocalTime | 僅時間(時分秒納秒) | 14:30:00.123 |
| LocalDateTime | 日期時間(無時區) | 2024-03-15T14:30:00 |
| ZonedDateTime | 帶時區日期時間 | 2024-03-15T14:30:00+08:00[Asia/Shanghai] |
| Instant | 時間戳(UTC,納秒精度) | 2024-03-15T06:30:00Z |
| Duration | 時間間隔(秒/納秒) | PT2H30M |
| Period | 日期間隔(年月日) | P1Y2M3D |
| DateTimeFormatter | 格式化/解析(線程安全) | yyyy-MM-dd HH:mm:ss |
// 當前時間
LocalDate today = LocalDate.now();
LocalDateTime now = LocalDateTime.now();
Instant nowInstant = Instant.now();
// 指定構造
LocalDate d = LocalDate.of(2024, 3, 15);
LocalDateTime dt = LocalDateTime.of(2024, 3, 15, 14, 30, 0);
ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.of("Asia/Shanghai"));
// 格式化輸出
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = now.format(fmt); // 2024-03-15 14:30:00
// 解析字符串
LocalDate parsedDate = LocalDate.parse("2024-03-15", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime parsedDt = LocalDateTime.parse("2024-03-15 14:30:00", fmt);
// 日期計算
LocalDate tomorrow = today.plusDays(1);
LocalDate nextMonth = today.plusMonths(1);
Period period = Period.between(LocalDate.of(2024,1,1), today); // 間隔年月日
long daysBetween = ChronoUnit.DAYS.between(LocalDate.of(2024,1,1), today); // 總天數
// 時間計算
Duration duration = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusHours(2));
long seconds = duration.getSeconds();
// 時區轉換
ZonedDateTime shanghai = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
ZonedDateTime newYork = shanghai.withZoneSameInstant(ZoneId.of("America/New_York"));
// 舊類互轉
Date oldDate = Date.from(instant);
Instant instant = oldDate.toInstant();
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
維護舊系統時仍需掌握,新代碼禁用。
Date date = new Date(); // 當前毫秒時間戳
long timestamp = date.getTime(); // 毫秒數
Date fromTs = new Date(timestamp); // 毫秒構造
// 格式化(線程不安全,需局部變量或 ThreadLocal)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);
Date parsed = sdf.parse("2024-03-15 14:30:00");
Calendar cal = Calendar.getInstance(); // 默認時區/語言環境
cal.setTime(date); // Date -> Calendar
cal.add(Calendar.DAY_OF_MONTH, 7); // 加 7 天
cal.set(Calendar.HOUR_OF_DAY, 0); // 置零時分秒毫秒
cal.clear(Calendar.MILLISECOND);
Date newDate = cal.getTime(); // Calendar -> Date
public static long daysBetween(Date start, Date end) {
if (start == null || end == null) return 0;
// 置零時分秒毫秒,確保按自然日計算
Calendar cal = Calendar.getInstance();
cal.setTime(start);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.clear(Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND);
long startDay = cal.getTimeInMillis();
cal.setTime(end);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.clear(Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND);
long endDay = cal.getTimeInMillis();
return (endDay - startDay) / (1000 * 60 * 60 * 24);
}
| 數據庫類型 | Java 類型(推薦) | 舊類型 | 說明 |
|---|---|---|---|
| DATE | LocalDate | java.sql.Date | 僅年月日 |
| TIME | LocalTime | java.sql.Time | 僅時分秒 |
| DATETIME / TIMESTAMP | LocalDateTime / ZonedDateTime | java.sql.Timestamp | 含時區建議 ZonedDateTime |
public class DateUtils {
// java.sql.Date <- LocalDate
public static java.sql.Date toSqlDate(LocalDate ld) {
return ld == null ? null : java.sql.Date.valueOf(ld);
}
public static LocalDate toLocalDate(java.sql.Date sd) {
return sd == null ? null : sd.toLocalDate();
}
// java.sql.Timestamp <- LocalDateTime
public static java.sql.Timestamp toSqlTimestamp(LocalDateTime ldt) {
return ldt == null ? null : java.sql.Timestamp.valueOf(ldt);
}
public static LocalDateTime toLocalDateTime(java.sql.Timestamp ts) {
return ts == null ? null : ts.toLocalDateTime();
}
// 字符串解析(多格式兼容)
public static LocalDate parseDate(String str, String... patterns) {
for (String p : patterns) {
try { return LocalDate.parse(str, DateTimeFormatter.ofPattern(p)); }
catch (DateTimeParseException ignored) {}
}
throw new IllegalArgumentException("Unparsable date: " + str);
}
}
掌握 `java.time` 體系,是現代 Java 開發者的必修課。拒絕 `Date`、`Calendar`、`SimpleDateFormat`,從今天開始寫正確、優雅、無 Bug 的日期時間代碼。