
Java 8之前的Date、Calendar线程不安全、设计混乱。Java 8引入的java.time包彻底解决了这些问题。本文系统讲解新日期时间API。一、核心类类用途LocalDate日期LocalTime时间LocalDateTime日期时间ZonedDateTime带时区Instant时间戳Duration时间间隔Period日期间隔DateTimeFormatter格式化二、创建与操作java复制下载LocalDate date LocalDate.now(); LocalDate date2 LocalDate.of(2024, 1, 1); LocalDate parsed LocalDate.parse(2024-01-01); LocalTime time LocalTime.now(); LocalTime time2 LocalTime.of(10, 30, 0); LocalDateTime dt LocalDateTime.now(); LocalDateTime dt2 LocalDateTime.of(2024, 1, 1, 10, 30); // 操作 LocalDate tomorrow date.plusDays(1); LocalDate lastMonth date.minusMonths(1); LocalDate withYear date.withYear(2025); // 获取字段 date.getYear(); date.getMonth(); // Month枚举 date.getMonthValue(); // 1-12 date.getDayOfWeek(); // DayOfWeek枚举 date.getDayOfMonth(); date.lengthOfMonth(); date.isLeapYear();三、时间戳与Instantjava复制下载Instant now Instant.now(); long epochMilli now.toEpochMilli(); Instant fromMilli Instant.ofEpochMilli(1704067200000L); LocalDateTime dt LocalDateTime.ofInstant(fromMilli, ZoneId.systemDefault());四、时区java复制下载ZoneId zone ZoneId.of(Asia/Shanghai); ZonedDateTime zdt ZonedDateTime.now(zone); // 时区转换 ZonedDateTime ny zdt.withZoneSameInstant(ZoneId.of(America/New_York)); System.out.println(ny); // 所有可用时区 ZoneId.getAvailableZoneIds().forEach(System.out::println);五、格式化java复制下载DateTimeFormatter fmt DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); String s LocalDateTime.now().format(fmt); LocalDateTime dt LocalDateTime.parse(2024-01-01 10:30:00, fmt); // 预定义格式 DateTimeFormatter.ISO_LOCAL_DATE DateTimeFormatter.ISO_DATE_TIME // 本地化 DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.CHINA);六、Duration与Periodjava复制下载// Duration时间间隔 Duration d Duration.between( LocalTime.of(10, 0), LocalTime.of(12, 30)); System.out.println(d.toMinutes()); // 150 // Period日期间隔 Period p Period.between( LocalDate.of(2024, 1, 1), LocalDate.of(2024, 3, 15)); System.out.println(p.getMonths() 个月 p.getDays() 天); // ChronoUnit long days ChronoUnit.DAYS.between(start, end); long hours ChronoUnit.HOURS.between(t1, t2);七、与旧API转换java复制下载// Date - Instant Date date new Date(); Instant instant date.toInstant(); // Instant - Date Date fromInstant Date.from(instant); // Calendar - ZonedDateTime Calendar cal Calendar.getInstance(); ZonedDateTime zdt ZonedDateTime.ofInstant( cal.toInstant(), cal.getZone()); // LocalDateTime - Date Date d Date.from(dt.atZone(ZoneId.systemDefault()).toInstant()); LocalDateTime ldt LocalDateTime.ofInstant(d.toInstant(), ZoneId.systemDefault());八、实战日期工具类java复制下载public class DateUtils { public static final DateTimeFormatter DATE_FMT DateTimeFormatter.ofPattern(yyyy-MM-dd); public static final DateTimeFormatter DATETIME_FMT DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); public static String format(LocalDateTime dt) { return dt null ? : dt.format(DATETIME_FMT); } public static LocalDateTime parse(String s) { return LocalDateTime.parse(s, DATETIME_FMT); } public static long daysBetween(LocalDate a, LocalDate b) { return ChronoUnit.DAYS.between(a, b); } public static boolean isSameDay(LocalDateTime a, LocalDateTime b) { return a.toLocalDate().equals(b.toLocalDate()); } public static LocalDateTime startOfDay(LocalDate date) { return date.atStartOfDay(); } public static LocalDateTime endOfDay(LocalDate date) { return date.atTime(LocalTime.MAX); } public static boolean isWeekend(LocalDate date) { DayOfWeek dow date.getDayOfWeek(); return dow DayOfWeek.SATURDAY || dow DayOfWeek.SUNDAY; } }九、注意事项线程安全java.time全部不可变线程安全。不要用比较用equals或isEqual。时区问题数据库存UTC展示转本地。MySQL映射DATETIME对应LocalDateTimeTIMESTAMP对应Instant。Jackson序列化配置JavaTimeModule。java复制下载Bean public ObjectMapper objectMapper() { ObjectMapper mapper new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; }十、总结java.time设计优雅、线程安全。掌握LocalDateTime、ZonedDateTime、Duration、DateTimeFormatter能应对几乎所有日期时间场景。