Java Date-Time
- java.time 是 Java 8 引入的全新日期时间 API,旨在替代旧的 java.util.Date、Calendar 和 SimpleDateFormat 等类,其设计遵循 ISO-8601 标准,解决了旧 API 设计混乱、线程不安全、时区处理复杂等诸多问题,提供了更直观易用、不可变(所有操作返回新对象,可以确保线程安全)、功能强大且符合现代需求的日期时间处理 API
- java.time 脱胎于 joda-time
LocalDate
LocalDate today = LocalDate.now();
LocalDate specificDate = LocalDate.of(2025, 6, 11);
LocalDate birthday = LocalDate.of(2000, Month.MAY, 15);
LocalDate localDate = LocalDate.parse("2025-02-03");
LocalTime
LocalTime now = LocalTime.now();
LocalTime specificTime = LocalTime.of(14, 30);
LocalTime specificTime = LocalTime.of(14, 30, 45);
LocalTime meetingTime = LocalTime.parse("15:30:10");
LocalDateTime
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime specificDateTime = LocalDateTime.of(specificDate, specificTime);
LocalDateTime specificDateTime = LocalDateTime.of(2025, Month.SEPTEMBER, 11, 4, 23);
LocalDateTime specificDateTime = LocalDateTime.of(2025, 6, 11, 14, 13, 17);
LocalDateTime parsedDateTime = LocalDateTime.parse("2025-05-15T14:30:45");
ZonedDateTime
- 带时区的日期时间,包含时区偏移(比如 +08:00)
ZonedDateTime zonedDateTime = ZonedDateTime.now();
ZonedDateTime shanghaiDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
ZonedDateTime londonDateTime = ZonedDateTime.of(2025, 6, 11, 14, 0, 0, 0, ZoneId.of("Europe/London"));
ZonedDateTime tokyoDateTime = ZonedDateTime.parse("2025-05-01T12:29:07.417938+09:00[Asia/Tokyo]");
ZoneId
ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime shanghaiDateTime = ZonedDateTime.now(shanghaiZoneId);
ZoneId newYorkZoneId = ZoneId.of("America/New_York");
ZonedDateTime nycTime = shanghaiDateTime.withZoneSameInstant(newYorkZoneId);
日期时间运算
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate nextWeek = today.plusDays(7);
LocalDate nextMonth = today.plusMonths(1);
LocalDate lastMonth = today.minusMonths(1);
LocalTime minusHours = now.minusHours(3);
LocalTime nextHour = now.plusHours(1);
LocalDateTime plusMinutes = dateTime.plusMinutes(3);
LocalDateTime plusSeconds = dateTime.minusSeconds(10);
日期时间比较
LocalDate start = LocalDate.of(2025, 1, 1);
LocalDate end = LocalDate.of(2025, 12, 31);
boolean isBefore = start.isBefore(end);
boolean isAfter = start.isAfter(end);
boolean isEqual = start.isEqual(end);
Instant 时刻
Instant now = Instant.now();
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai"));
LocalDate localDate = zonedDateTime.toLocalDate();
LocalTime localTime = zonedDateTime.toLocalTime();
LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
Period 周期
Period period = Period.between(startDate, endDate);
Period oneWeek = Period.ofDays(7);
Period oneWeek = Period.ofWeeks(1);
Period period = Period.ofYears(2).ofMonths(3).ofDays(5);
int years = period.getYears()
int months = period.getMonths()
int days = period.getDays()
Duration 持续时间
Duration twoHours = Duration.ofHours(2);
Duration duration = Duration.between(startTime, endTime);
long hoursDiff = duration.toHours();
long minutesDiff = duration.toMinutes();
long minutesBetween = ChronoUnit.MINUTES.between(startTime, endTime);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
DateTimeFormatter
LocalDate parsedDate = LocalDate.parse("2025-06-11", DateTimeFormatter.ISO_DATE);
LocalDate parsedDate = LocalDate.parse("2025-06-11+08:00", DateTimeFormatter.ISO_DATE);
LocalDate parsedTime = LocalDate.parse("14:30", DateTimeFormatter.ISO_TIME);
LocalDate parsedTime = LocalDate.parse("14:30:33", DateTimeFormatter.ISO_TIME);
LocalDate parsedTime = LocalDate.parse("14:30:33+08:00", DateTimeFormatter.ISO_TIME);
LocalDateTime parseDateTime = LocalDateTime.parse("2025-06-11T14:30", DateTimeFormatter.ISO_DATE_TIME);
LocalDateTime parseDateTime = LocalDateTime.parse("2025-06-11T14:30:33+08:00", DateTimeFormatter.ISO_DATE_TIME);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("2025-05-05 12:30:33", dateTimeFormatter);
String formattedDateTime = dateTime.format(dateTimeFormatter);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2025-05-05", dateTimeFormatter);
String formattedDate = date.format(dateTimeFormatter);
Clock
Clock clock = Clock.systemUTC();
Instant now = Instant.now(clock);
LocalDate 和 LocalDateTime 互转
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = localDate.atStartOfDay();
LocalDateTime localDateTime = localDate.atTime(8,20,33);
LocalDateTime localDateTime = localDate.atTime(LocalTime.now());
java.util.Date 和 Instant 互转
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
Instant instant = Instant.ofEpochMilli(date.getTime());
Instant instant = Instant.now();
java.util.Date date = java.util.Date.from(instant);
TemporalAdjusters 时间调整器
LocalDate today = LocalDate.now();
LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth());
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
LocalDate firstDayOfYear = today.with(TemporalAdjusters.firstDayOfYear());