Java 8 引入 java.time 包,徹底解決舊 API (Date, Calendar, SimpleDateFormat) 不可變、非線程安全、設計混亂等歷史包袱。本文提供 20 個生產級高頻場景模板。
| 類 | 用途 | 關鍵特性 |
|---|---|---|
Instant | 時間戳 (納秒精度) | UTC、機器時間、等價舊 Date |
LocalDate | 日期 (年月日) | 無時區、生日/記念日 |
LocalTime | 時間 (時分秒納秒) | 無日期、鬧鐘/營業時間 |
LocalDateTime | 日期時間 | 無時區、本地日程 |
ZonedDateTime | 帶時區日期時間 | 含時區規則、用戶顯示、跨時區業務 |
Duration | 時間間隔 | 秒/納秒、Instant 間差 |
Period | 日期間隔 | 年月日、LocalDate 間差 |
LocalDate.now()LocalDate.of(2024, 1, 15)LocalDate.parse("2024-01-15", DateTimeFormatter.ISO_LOCAL_DATE)date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))date.plusDays(7), date.minusMonths(1), date.plus(1, ChronoUnit.YEARS)date.getYear(), date.getMonthValue(), date.getDayOfWeek()date.lengthOfMonth(), date.isLeapYear()date1.isBefore(date2), date1.isAfter(date2), date1.equals(date2)Period.between(start, end).getDays() / .getMonths()LocalTime.now()time.plusHours(2)LocalDateTime.of(date, time), ldt.toLocalDate()ZonedDateTime.of(localDateTime, ZoneId.of("America/New_York"))zoned.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))Instant.now(), Date.from(instant), date.toInstant()DateTimeFormatter.ofPattern("yyyyMMdd").parse("20240115")DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss z", Locale.US)Duration.between(startInstant, endInstant).toMinutes()Clock clock = Clock.fixed(Instant.parse("2024-01-15T10:00:00Z"), ZoneOffset.UTC); LocalDate.now(clock)ps.setObject(1, localDate) / rs.getObject(i, LocalDate.class)DateTimeFormatter 可作 static final 共享。mm 分鐘,MM 月份,切勿混淆。ZoneId.getAvailableZoneIds() 查驗。Date.toInstant(), Date.from(instant),避免 GregorianCalendar。拋棄 SimpleDateFormat 與 Calendar,擁抱 java.time 的不可變、領域驅動設計,讓時間處理成為業務邏輯的可靠基石。