Java 的时间 API 在 Java 8 中做出了重大改进,推出了 java.time 包,它提供了对日期、时间、时区等的更好支持。与旧版的 java.util.Date 和 java.util.Calendar 相比,新的时间 API 更加简洁、安全和易于使用
java.util.Date 是一个较老的日期时间类,功能较为简单且存在一些设计上的缺陷(如线程不安全、时区问题等)。
java.time 是 Java 8 引入的全新日期时间 API,解决了 java.util.Date 的问题,提供了更清晰、灵活、线程安全的日期时间处理功能。
现代 Java 开发中,建议使用 java.time 包来处理日期和时间,而 java.util.Date 主要用于兼容旧代码或与旧的库进行交互时。
总体而言,java.time 提供了更强大、更易用的功能,能够更好地处理日期和时间,尤其在涉及时区、日期运算和格式化等方面有着明显的优势。
LocalDateTime
JDK8带来了新的时间日期API也就是 java.time 包下面带来Local和Zone,他俩的区别一个是基于你本地时间的,一个是你自己指定时区的。
而Local都有这几个类:LocalDateTime(既包含时间也包含日期),LocalDate(只关注日期,一般来说你只关注日期不需要时间的话用这个),LocalTime(只关注时间,不关注日期)。
当然了,实际上LocalDate和LocalTime也支持日期+时间的形式,那他是怎么做到的呢,因为LocalDate里面包含一个atTime来存储时间,同理LocalTime也有一个atDate属性
例如:
LocalDate localDate = LocalDate.of(2021,3,15);
localDate.atTime(LocalTime.now());
但是如果不想多设置的话可以直接使用LocalDateTime,将日期时间一起处理了。
LocalDateTime localDateTime = LocalDateTime.now();
所以说LocalDateTime取代Date是一个趋势,当然有人比较过二者的效率,结果是Date要比LocalDateTIme快一些,这也没办法毕竟线程安全可能就要多点取舍,未来的版本也许LocalDateTime也可以像Current集合那样线程又安全又快。
在 Java 中,java.time 和 java.util.Date 都是用来处理日期和时间的类,但是它们的设计理念和功能有很大的不同。java.time 是 Java 8 引入的新时间 API,而 java.util.Date 是 Java 早期版本中的时间类。
1. java.util.Date:旧版日期时间类
java.util.Date 是早期 Java 版本中提供的日期时间类。它包含了时间戳(自 1970年1月1日以来的毫秒数)以及日期和时间信息,但它的设计存在一些问题,特别是在处理时区、线程安全以及可读性方面。
特点:
● 不可变性:Date 对象是可变的,修改日期时间后会改变该对象的状态。
● 时区问题:Date 存储的是 UTC 时间,但它并没有提供直接的时区处理功能。
● 线程安全:Date 是线程不安全的,多个线程同时修改同一个 Date 对象时可能导致数据不一致。
弃用方法:许多 Date 类中的方法已被弃用(如 getYear(), getMonth() 等),这些方法的使用不推荐。
示例:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date date = new Date(); // 获取当前日期和时间
System.out.println(date); // 输出当前日期和时间
}
}
2. java.time:Java 8 新的日期时间 API
在 Java 8 中,引入了全新的 java.time 包,它提供了更强大的日期和时间处理功能,并解决了 java.util.Date 的一些缺陷。java.time API 包含了不可变类和更多的功能,支持时区、日期计算、格式化等。
特点:
不可变性:java.time 中的所有类(如 LocalDate, LocalTime, LocalDateTime 等)都是不可变的。这意味着每次修改都会返回一个新的对象,而不是修改原有对象。
线程安全:由于不可变性,java.time 的类是线程安全的,可以安全地在多个线程之间共享。
清晰的 API 设计:java.time 的 API 更加直观、易用,支持链式调用,避免了老版 java.util.Date 中的各种复杂性。
更好的时区支持:通过 ZonedDateTime 和 ZoneId,可以方便地处理时区问题。
示例:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class JavaTimeExample {
public static void main(String[] args) {
// 获取当前日期、时间和日期时间
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("当前日期: " + today);
System.out.println("当前时间: " + now);
System.out.println("当前日期和时间: " + dateTime);
// 格式化日期时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter);
System.out.println("格式化后的日期时间: " + formattedDateTime);
}
}
3. java.time 和 java.util.Date 的对比
特性 java.util.Date java.time API
不可变性 Date 对象是可变的 java.time 类是不可变的
线程安全 不线程安全 线程安全
时区支持 只支持 UTC,时区支持不强 通过 ZonedDateTime 和 ZoneId 支持时区
功能性 功能较为简单,处理时区和计算日期不方便 提供丰富的日期时间操作功能,如 Duration, Period, DateTimeFormatter 等
格式化和解析 使用 SimpleDateFormat 进行格式化和解析 使用 DateTimeFormatter 进行格式化和解析
过时方法 有许多过时的方法(如 getYear()) 没有过时方法,更现代化的 API
4. 常见的转换:java.util.Date 和 java.time 的互转
尽管 java.time 是现代推荐的日期时间 API,但在某些情况下,你可能需要将 java.util.Date 和 java.time 进行互转。以下是一些常见的转换方法。
从 java.util.Date 转换到 java.time:
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DateToJavaTime {
public static void main(String[] args) {
// 创建一个 Date 对象
Date date = new Date();
// 将 Date 转换为 Instant
Instant instant = date.toInstant();
// 将 Instant 转换为 ZonedDateTime
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
System.out.println("ZonedDateTime: " + zonedDateTime);
}
}
从 java.time 转换到 java.util.Date:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class JavaTimeToDate {
public static void main(String[] args) {
// 获取当前的 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();
// 将 LocalDateTime 转换为 Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("Date: " + date);
}
}
2864

被折叠的 条评论
为什么被折叠?



