java.util.Date和java.time.LocalDate对比及分析

 更新时间:2026年05月16日 09:21:51   作者:拽着尾巴的鱼儿  
本文介绍了java.util.Date和java.time下的日期两种日期类型的区别和使用场景,前者表示一个瞬时时间点,包含日期+时间,后者仅表示纯日期,后者时区无关联,而前者依赖操作系统时区显示,两者之间可以相互转换,并且可以格式化输出

前言

本文记录 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.Datejava.time.LocalDate
版本JDK 1.0JDK 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常用到的六个加密技术和代码

    总结Java常用到的六个加密技术和代码

    大家要记住现代密码学最重要的原则柯克霍夫原则:数据的安全基于密钥而不是算法的保密。也就是说即使密码系统的任何细节已为人悉知,只要密匙未洩漏,它也应是安全的。这篇文章给大家介绍了6个常用的加密技术和代码。
    2016-07-07
  • SpringBoot使用maven指定依赖包的版本(解决示例)

    SpringBoot使用maven指定依赖包的版本(解决示例)

    我们在使用A依赖的时候,这个依赖有引入了第三方B依赖,这时候我想指定B依赖的版本号,下面个大家分享解决示例,对SpringBoot maven依赖包相关配置方法感兴趣的朋友一起看看吧
    2024-04-04
  • Spring boot通过切面,实现超灵活的注解式数据校验过程

    Spring boot通过切面,实现超灵活的注解式数据校验过程

    这篇文章主要介绍了Spring boot通过切面,实现超灵活的注解式数据校验过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring中的@Resource源码解析

    Spring中的@Resource源码解析

    这篇文章主要介绍了Spring中的@Resource源码解析,这个注解加载的时候经过的类是CommonAnnotationBeanPostProcessor和Autowired一样,也是postProcessProperties()方法,需要的朋友可以参考下
    2023-09-09
  • Freemarker中的3种循环模式

    Freemarker中的3种循环模式

    这篇文章主要介绍了Freemarker中的3种循环模式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot整合tkMapper的方法

    SpringBoot整合tkMapper的方法

    项目使用SpringBoot2.0,H2数据库,使用了 Lombok 简化代码,下面是本人使用SpringBoot整合tkMapper的一个小demo,记录下来本人在此处踩得坑
    2022-11-11
  • Springboot+Stomp协议实现聊天功能

    Springboot+Stomp协议实现聊天功能

    本示例实现一个功能,前端通过websocket发送消息给后端服务,后端服务接收到该消息时,原样将消息返回给前端,前端技术栈html+stomp.js,后端SpringBoot,需要的朋友可以参考下
    2024-02-02
  • 使用Spring提高接口吞吐量的常见方法

    使用Spring提高接口吞吐量的常见方法

    吞吐量衡量系统性能的关键指标,通常指单位时间内系统可以处理的请求数量,面对高并发,我们该如何利用 Spring 构建一个高吞吐、高可用的接口系统?本文系统地分享在 Spring 中提升接口吞吐量的几种常见手段,需要的朋友可以参考下
    2025-06-06
  • Java的Tomcat和Servlet的运行原理详解

    Java的Tomcat和Servlet的运行原理详解

    这篇文章主要为大家详细介绍了Java的Tomcat和Servlet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java split方法使用超详细讲解

    Java split方法使用超详细讲解

    这篇文章主要给大家介绍了关于Java split方法使用的相关资料,Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,需要的朋友可以参考下
    2023-10-10

最新评论