LocalDate、LocalTime、LocalDateTime详解
这三个类是Java 8日期时间API的核心,它们分别处理日期、时间和日期时间。不可变且线程安全。
三者关系
LocalDate = "2026年6月15日"(日历上的一个日期)
LocalTime = "14:30:00"(手表上的一个时刻)
LocalDateTime = "2026年6月15日 14:30:00"(日程表上的一个时间点)
LocalDate - 日期处理
创建LocalDate
import java.time.LocalDate;
public class LocalDateDemo {
public static void main(String[] args) {
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("今天: " + today); // 2026-06-15
// 创建指定日期 - 直观易懂!
LocalDate birthday = LocalDate.of(2000, 1, 1); // 2000年1月1日
LocalDate christmas = LocalDate.of(2026, 12, 25); // 2026年12月25日
// 从字符串解析(ISO格式)
LocalDate parsed = LocalDate.parse("2026-06-15");
System.out.println("解析: " + parsed);
// 使用plus/minus计算日期
LocalDate nextWeek = today.plusWeeks(1);
LocalDate lastMonth = today.minusMonths(1);
LocalDate nextYear = today.plusYears(1);
System.out.println("一周后: " + nextWeek);
System.out.println("一月前: " + lastMonth);
// 获取日期组成部分
System.out.println("年: " + today.getYear());
System.out.println("月: " + today.getMonthValue()); // 6(不是0开始的!)
System.out.println("日: " + today.getDayOfMonth());
System.out.println("星期: " + today.getDayOfWeek()); // FRIDAY
System.out.println("一年中的第几天: " + today.getDayOfYear());
// 判断
System.out.println("是否闰年: " + today.isLeapYear());
System.out.println("是否周末: " + (today.getDayOfWeek().getValue() > 5));
}
}
LocalTime - 时间处理
创建LocalTime
import java.time.LocalTime;
public class LocalTimeDemo {
public static void main(String[] args) {
// 获取当前时间
LocalTime now = LocalTime.now();
System.out.println("现在: " + now); // 14:30:15.123456
// 创建指定时间
LocalTime noon = LocalTime.of(12, 0); // 中午12:00
LocalTime afternoon = LocalTime.of(14, 30, 15); // 下午2:30:15
LocalTime midnight = LocalTime.of(0, 0, 0); // 午夜
// 从字符串解析
LocalTime parsed = LocalTime.parse("14:30:00");
// 使用plus/minus计算时间
LocalTime later = now.plusHours(2);
LocalTime earlier = now.minusMinutes(30);
System.out.println("两小时后: " + later);
// 获取时间组成部分
System.out.println("时: " + now.getHour());
System.out.println("分: " + now.getMinute());
System.out.println("秒: " + now.getSecond());
System.out.println("纳秒: " + now.getNano());
// 时间比较
LocalTime deadline = LocalTime.of(17, 0);
System.out.println("现在在截止时间之前: " + now.isBefore(deadline));
}
}
LocalDateTime - 日期时间处理
创建LocalDateTime
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LocalDateTimeDemo {
public static void main(String[] args) {
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("当前: " + now); // 2026-06-15T14:30:00
// 方法1:直接指定
LocalDateTime dt1 = LocalDateTime.of(2026, 6, 15, 10, 30);
LocalDateTime dt2 = LocalDateTime.of(2026, 6, 15, 10, 30, 15);
LocalDateTime dt3 = LocalDateTime.of(2026, 6, 15, 10, 30, 15, 123456789);
// 方法2:日期 + 时间
LocalDate date = LocalDate.of(2026, 6, 15);
LocalTime time = LocalTime.of(10, 30);
LocalDateTime dt4 = LocalDateTime.of(date, time);
System.out.println("组合: " + dt4);
// 方法3:从字符串解析
LocalDateTime parsed = LocalDateTime.parse("2026-06-15T10:30:00");
// 加减运算
System.out.println("加一天: " + now.plusDays(1));
System.out.println("减两小时: " + now.minusHours(2));
System.out.println("加一年减一天: " + now.plusYears(1).minusDays(1));
// with方法 - 直接设置值
System.out.println("设置小时为12: " + now.withHour(12));
System.out.println("设置月初: " + now.withDayOfMonth(1));
}
}
日期时间格式化
DateTimeFormatter - 强大的格式化工具
import java.time.*;
import java.time.format.*;
public class DateTimeFormatterDemo {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
// 使用预定义格式
DateTimeFormatter iso = DateTimeFormatter.ISO_DATE_TIME;
System.out.println("ISO格式: " + now.format(iso));
// 自定义格式
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("HH:mm:ss");
DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
DateTimeFormatter f4 = DateTimeFormatter.ofPattern("EEEE");
System.out.println("日期: " + now.format(f1));
System.out.println("时间: " + now.format(f2));
System.out.println("中文: " + now.format(f3));
System.out.println("星期: " + now.format(f4)); // 星期六
// 解析字符串
LocalDate date = LocalDate.parse("2026-06-15", f1);
LocalDateTime dt = LocalDateTime.parse("2026-06-15 10:30:00",
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("解析日期: " + date);
System.out.println("解析日期时间: " + dt);
}
}
常用格式化符号
| 符号 | 含义 | 示例 |
|---|---|---|
| y | 年 | 2026 |
| MM | 月(两位) | 06 |
| MMM | 月(英文缩写) | Jun |
| dd | 日(两位) | 15 |
| HH | 24小时制 | 14 |
| hh | 12小时制 | 02 |
| mm | 分钟 | 30 |
| ss | 秒 | 45 |
| EEEE | 星期几(完整) | Saturday |
| a | 上午/下午 | PM |
日期时间比较
import java.time.LocalDate;
public class DateCompareDemo {
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2026, 1, 1);
LocalDate d2 = LocalDate.of(2026, 6, 15);
LocalDate d3 = LocalDate.of(2026, 1, 1);
// 比较方法
System.out.println("d1在d2之前: " + d1.isBefore(d2)); // true
System.out.println("d1在d2之后: " + d1.isAfter(d2)); // false
System.out.println("d1等于d3: " + d1.isEqual(d3)); // true
// 判断是否在某个范围内
LocalDate start = LocalDate.of(2026, 1, 1);
LocalDate end = LocalDate.of(2026, 12, 31);
LocalDate check = LocalDate.of(2026, 6, 15);
boolean inRange = !check.isBefore(start) && !check.isAfter(end);
System.out.println("在范围内: " + inRange); // true
}
}
时间戳Instant
Instant表示从1970-01-01T00:00:00Z(UTC时间)开始经过的秒数和纳秒数,适合机器处理。
import java.time.Instant;
public class InstantDemo {
public static void main(String[] args) {
// 获取当前时间戳
Instant now = Instant.now();
System.out.println("当前时间戳: " + now);
System.out.println("秒数: " + now.getEpochSecond());
System.out.println("纳秒: " + now.getNano());
// 从秒数创建
Instant fromEpoch = Instant.ofEpochSecond(1712345678);
Instant fromEpochMilli = Instant.ofEpochMilli(1712345678905L);
// 时间戳运算
Instant later = now.plusSeconds(3600); // 一小时后
Instant before = now.minusSeconds(3600); // 一小时前
// 与LocalDateTime互转(需要时区)
java.time.ZonedDateTime zdt = now.atZone(java.time.ZoneId.systemDefault());
System.out.println("转为带时区: " + zdt);
}
}
小结
- LocalDate:只处理日期(年月日),适合生日、到期日
- LocalTime:只处理时间(时分秒),适合定时任务
- LocalDateTime:处理完整的日期时间,适合大多数场景
- DateTimeFormatter:强大的格式化工具,支持自定义格式
- isBefore/isAfter:安全的日期比较方式
- Instant:机器友好的时间戳,适合日志和持久化