java.util.Date和java.time.LocalDate对比及分析
前言
本文记录 jdk 中日期 java.util.Date 和 java.time 下的日期 两者的区别和使用 。
一、 java.util 和 java.time 下日期的区别
1.1 java.util.date
Date 内部只存一个毫秒数,全球只有一个值,但不同时区显示不同,它不存时区,不存年、月、日、时、分、秒。在我们new Date () 后查看人日期,此时该日期会通过当前时区(jvm 时区) 显示日期:
long timestamp; // 从 1970-01-01 00:00:00 UTC 开始的毫秒
当你打印 new Date() 时,Java 会自动用你当前系统的时区把时间戳转成日期时间显示
比如同一个时间戳:
在中国时区 → 显示 2025-12-25 20:00:00 在纽约时区 → 显示 2025-12-25 07:00:00
java.util.Date 本身不存时区,但它依赖系统时区 ** 显示,所以你会感觉它 “带时区”。
1.2 java.time.LocalDate
java.time.LocalDate 真的完全不带时区 **,它就是一个纯日历日期,跟你挂墙上的日历一模一样。
LocalDate 存的是:
int year, month, day;
它就是一个纯日期:2025-12-25
它不关心你在哪个国家、哪个时区。
北京是 2025-12-25 纽约也是 2025-12-25 伦敦也是 2025-12-25
LocalDate 不跟时间戳绑定,不跟任何时区绑定。
1.3 两者的对比
| 对比项 | java.util.Date | java.time.LocalDate |
|---|---|---|
| 版本 | JDK 1.0 | JDK 8+ |
| 是否线程安全 | ❌ 非线程安全(可变类) | ✅ 线程安全(不可变类) |
| 存储内容 | 时间戳(毫秒) | 包含日期 + 时间 + 时区 仅纯日期(年 - 月 - 日),无时间、无时区 |
| 易用性 | ❌ 难用(方法命名混乱、很多方法废弃) | ✅ 极简(方法语义化,如 plusDays()) |
| 时区处理 | 隐含时区,易出 bug | 无时区,需要时区用 ZonedDateTime |
| 常用场景 | 遗留系统、旧代码 | 新项目、日常开发首选 |
二、两者的使用
2.1 java.util.date
Date:表示一个瞬时时间点,包含 日期 + 时间(时:分: 秒:毫秒),底层是 long 类型时间戳
Date date = new Date(); System.out.println(date); // 输出:Wed May 21 15:30:20 CST 2025
此时new Date() 存入 MySQL datetime 字段,最终存进去的是:你 Java 程序所在服务器的【当前系统时间(年月日 时分秒)】
2.2 java.time.LocalDate
LocalDate:仅表示纯日期,没有时间、没有时区,比如 2025-05-21。
LocalDate localDate = LocalDate.now();
System.out.println(localDate); // 输出:2025-05-21
LocalDate l1 = LocalDate.now();
// 按照时区定义日期
LocalDate l2 = LocalDate.now(ZoneId.of("US/Eastern"));
LocalDateTime l3 = LocalDateTime.now();
// 按照时区定义日期
LocalDateTime l4 = LocalDateTime.now(ZoneId.of("US/Eastern"));
LocalDate/LocalDateTime 存入 MySQL datetime 字段:存的就是你代码里写的【字面时间】,不做任何时区转换!你给它什么时间,它就原封不动存进数据库。
2.3 java.time 日期
LocalDate:只存 日期(年 - 月 - 日)LocalTime:只存 时间(时:分: 秒)LocalDateTime:存 日期 + 时间(无时区)Instant:存 时间戳(全球统一、带时区概念)
| 类名 | 包含内容 | 时区 | 本质 |
|---|---|---|---|
| LocalDate | 年月日 | 无时区 | 日历日期 |
| LocalTime | 时分秒 | 无时区 | 钟表时间 |
| LocalDateTime | 年月日 + 时分秒 | ❌ 无时区 | 本地日期时间 |
| 时间戳 | UTC | 时区 | 全球统一时间点 |
2.4 相互转换
Date 转LocalDate
public static LocalDate dateToLocalDate(Date date) {
return date.toInstant()
// .atZone(ZoneId.systemDefault())
.atZone(ZoneId.of("US/Eastern"))
.toLocalDate();
}
public static LocalDateTime dateToLocalDateTime(Date date) {
return date.toInstant()
// .atZone(ZoneId.systemDefault())
.atZone(ZoneId.of("US/Eastern"))
.toLocalDateTime();
}
LocalDate 转 Date
// 给 LocalDateTime 绑定时区(必须!否则不知道是哪个时区的时间)
public static Date localDateToDate(LocalDate localDate) {
return Date.from(
localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()
);
}
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
return Date.from(
localDateTime.atZone(ZoneId.systemDefault()).toInstant()
);
}
2.5 格式化输出
// 日期格式
public static final String DATE_PATTERN = "yyyy-MM-dd";
// 日期时间格式
public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* LocalDate -> yyyy-MM-dd
*/
public static String formatDate(LocalDate date) {
if (date == null) {
return null;
}
return date.format(DateTimeFormatter.ofPattern(DATE_PATTERN));
}
/**
* LocalDateTime -> yyyy-MM-dd HH:mm:ss
*/
public static String formatDateTime(LocalDateTime dateTime) {
if (dateTime == null) {
return null;
}
return dateTime.format(DateTimeFormatter.ofPattern(DATETIME_PATTERN));
}
总结
本文介绍java.util.Date和java.time.LocalDate 的区别和使用。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法
在Java开发中我们经常会遇到运行Jar包时闪退的问题,下面这篇文章主要给大家介绍了关于java环境配好后jar文件打开命令框闪退(无打开方式,无反应)的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下2024-04-04
解决java调用dll报Unable to load library错误的问题
这篇文章主要介绍了解决java调用dll报Unable to load library错误的问题。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11


最新评论