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环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    在Java开发中我们经常会遇到运行Jar包时闪退的问题,下面这篇文章主要给大家介绍了关于java环境配好后jar文件打开命令框闪退(无打开方式,无反应)的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Spring Boot 项目开发全流程实战示例总结

    Spring Boot 项目开发全流程实战示例总结

    本文详细介绍了SpringBoot项目的开发流程,从实体类定义到Controller接口开放,涵盖了代码注释、核心概念图解及高频面试题,通过实际操作,展示了如何实现用户增删改查功能,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 解决java调用dll报Unable to load library错误的问题

    解决java调用dll报Unable to load library错误的问题

    这篇文章主要介绍了解决java调用dll报Unable to load library错误的问题。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring Boot CLI使用教程

    Spring Boot CLI使用教程

    本篇文章主要介绍了Spring Boot CLI使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 每天学Java!一分钟了解JRE与JDK

    每天学Java!一分钟了解JRE与JDK

    每天学Java!一分钟了解JRE与JDK,什么是JRE?什么是JDK?什么是JVM?相信通过本文大家都会有所了解,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Java的Function接口与andThen组合及解读

    Java的Function接口与andThen组合及解读

    文章介绍了Java 8中的Function接口及其andThen方法,详细解释了Function接口的基础概念、用法、组合机制及应用,包括与compose方法的对比、在Stream API中的使用场景、高级应用场景和最佳实践,并强调了保持代码简洁、可读性和灵活性的重要性
    2026-04-04
  • Java中的Caffeine加载与驱逐策略详解

    Java中的Caffeine加载与驱逐策略详解

    这篇文章主要介绍了Java中的Caffeine加载与驱逐策略详解,Caffeine是基于Java 8的高性能缓存库,可提供接近最佳的命中率,Caffeine与ConcurrentMap相应,但是不完全相同,本文主要介绍Caffeine,需要的朋友可以参考下
    2023-10-10
  • Java 高并发的三种实现案例详解

    Java 高并发的三种实现案例详解

    这篇文章主要介绍了Java 高并发的三种实现案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • IntelliJ IDEA代码提示忽略大小写的具体设置步骤

    IntelliJ IDEA代码提示忽略大小写的具体设置步骤

    在IDEA开发过程中,代码补全功能是提升编码效率的核心特性之一,默认情况下,IDEA的代码提示会严格匹配大小写,这对于遵循命名规范的项目是合理的,然而,在某些场景下,开发者可能希望代码提示忽略大小写,以提升输入灵活性,所以本文介绍了如何设置IDEA提示忽略大小写
    2025-06-06
  • SpringBoot设置Json返回字段为非空问题

    SpringBoot设置Json返回字段为非空问题

    这篇文章主要介绍了SpringBoot设置Json返回字段为非空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论