Java Date 对象详解

一、 Java Date 对象

Java Date 类表示日期和时间,可以存储从1970年1月1日零时(格林威治标准时间)起累计的毫秒数。Date 对象支持日期的计算和显示,并且可以与其他系统进行时间数据的交换。

  1. 创建 Date 对象

Java 中创建 Date 对象的方式有多种,例如:

(1) 使用空构造函数创建一个当前日期和时间的对象。

Date date = new Date();

(2) 使用指定毫秒数的构造函数创建一个指定时刻的对象。

Date date = new Date(1618977192000L);
  1. 常用方法

Date 类提供了以下常用方法:

(1) getTime():返回自 1970 年 1 月 1 日零时开始累计的毫秒数。

(2) setTime(long time):设置自 1970 年 1 月 1 日零时开始累计的毫秒数。

(3) equals(Object obj):比较当前日期和时间是否等于另一个日期和时间。

(4) compareTo(Date anotherDate):将当前日期和时间与另一个日期和时间比较,如果当前日期和时间更早则返回负数,如果相等则返回 0,如果当前日期和时间更晚则返回正数。

(5) before(Date when) 和 after(Date when):分别表示当前日期和时间是否在另一个日期和时间之前或之后。

  1. 问题

Date 类存在以下问题:

(1) 可变性问题:Date 对象是可变的,因此在多线程环境下,可能会发生并发问题。

(2) 易混淆问题:Date 类提供的 getYear() 方法返回的是从 1900 年开始的年份,而且月份从 0 开始计算。

(3) 不支持国际化问题:Date 类不支持国际化,因此无法根据不同的语言和文化输出日期和时间。

二、 时间格式化

Java 提供了 SimpleDateFormat 类来格式化和解析日期和时间。SimpleDateFormat 类使用预定义的模式来指定日期和时间格式,也可以通过自定义模式来输出或解析日期和时间。

  1. 常用模式

以下是一些常用的预定义模式:

模式 描述
yyyy-MM-dd 日期(年-月-日)
HH:mm:ss 时间(时:分:秒)
yyyy-MM-dd HH:mm:ss 日期时间(年-月-日 时:分:秒)
E 星期几
MMM 月份(Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec)
yyy/MM/dd HH:mm:ss ZZ 自定义日期时间格式
  1. 使用 SimpleDateFormat 格式化日期和时间

使用 SimpleDateFormat 可以将 Date 类型的日期和时间转换为指定模式的字符串。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String strDate = sdf.format(date);
System.out.println("当前日期时间为:" + strDate);
  1. 使用 SimpleDateFormat 解析日期和时间

使用 SimpleDateFormat 可以将指定模式的字符串转换为 Date 类型的日期和时间,也可以根据不同的语言和文化输出日期和时间。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = "2022-08-10 12:34:56";
try {
    Date date = sdf.parse(strDate);
    System.out.println("解析后的日期时间为:" + date);
} catch (ParseException e) {
    e.printStackTrace();
}
  1. 问题

SimpleDateFormat 类存在以下问题:

(1) 线程安全问题:SimpleDateFormat 对象是可变的,因此在多线程环境下,可能会发生并发问题。

(2) 易混淆问题:SimpleDateFormat 类提供的大写和小写字母形式可能会导致模式模棱两可。

(3) 不支持国际化问题:SimpleDateFormat 类不支持国际化,因此无法根据不同的语言和文化输出日期和时间。

三、 Java 8 时间日期 API

Java 8 引入了新的时间日期 API(Java Time API),提供了更加易于理解和使用的类和方法,并且克服了 Date 类和 SimpleDateFormat 类存在的许多问题。新的时间日期 API 是不可变的,支持线程安全和国际化,提供了更加灵活和强大的日期和时间处理能力。

  1. LocalDate

LocalDate 类表示日期,不包含时间和时区的信息。可以使用 now() 方法获得当前的日期,并且支持加减天数、月份和年份等操作。

LocalDate date = LocalDate.now();
System.out.println("当前日期为:" + date);
  1. LocalTime

LocalTime 类表示时间,不包含日期和时区的信息。可以使用 now() 方法获得当前的时间,并且支持加减小时、分钟和秒数等操作。

LocalTime time = LocalTime.now();
System.out.println("当前时间为:" + time);
  1. LocalDateTime

LocalDateTime 类表示日期和时间,不包含时区信息。可以使用 now() 方法获得当前的日期和时间,并且支持加减天数、月份和年份等操作。

LocalDateTime dateTime = LocalDateTime.now();
System.out.println("当前日期时间为:" + dateTime);
  1. ZonedDateTime

ZonedDateTime 类表示日期、时间和时区信息。可以使用 now() 方法获得当前的日期、时间和时区,并且支持加减天数、月份和年份等操作。

ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前日期时间和时区为:" + zonedDateTime);
  1. Instant

Instant 类表示 Unix 时间戳,即自 1970 年 1 月 1 日零时开始累计的秒数和纳秒数。可以使用 now() 方法获得当前的 Unix 时间戳,并且支持加减秒数和纳秒数等操作。

Instant instant = Instant.now();
System.out.println("当前 Unix 时间戳为:" + instant);
  1. DateTimeFormatter

DateTimeFormatter 类提供了格式化和解析日期和时间的方法,并且支持自定义模式和支持国际化。

LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String strDateTime = dateTime.format(formatter);
System.out.println("当前日期时间为:" + strDateTime);
  1. 问题

Java 8 时间日期 API 不存在 Date 类和 SimpleDateFormat 类存在的问题,提供了更加易于理解和使用的类和方法,并且克服了线程安全、易混淆和不支持国际化等问题。

四、 总结

本文介绍了 Java Date 对象及时间格式化。Java Date 类表示日期和时间,可以存储从 1970 年 1 月 1 日零时开始累计的毫秒数,在多线程环境下可能会发生并发问题,并且易混淆和不支持国际化。Java 提供了 SimpleDateFormat 类来格式化和解析日期和时间,存在线程安全、易混淆和不支持国际化等问题。Java 8 引入了新的时间日期 API(Java Time API),提供了更加易于理解和使用的类和方法,并且克服了存在的许多问题。论述了常用模式,以及使用各种类和方法的代码示例,希望读者能够了解这些知识点,更好地应用它们来处理日期和时间相关的问题。