java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java.util.Date和java.time.LocalDate对比

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

作者:拽着尾巴的鱼儿

本文介绍了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年月日 + 时分秒❌ 无时区本地日期时间
时间戳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 的区别和使用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文