第十章 Java 日期和时间
Java.util
包中提供了许多工具类,包含集合框架
、事件模型
、日期
和时间
设施、国际化的各种实用工具类
(字符串标记生成器、随机数生成器和位数组、日期Date
类、堆栈Stack
类、向量Vector
类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。在软件开发过程中,这些工具类使用十分频繁。
一、Java.util.Date类
JDK
提供的java.util
包下,有一个Date
类,该类的对象可以用来表示一个特定的瞬间,精确到毫秒。它为特定瞬间与一组诸如
YEAR,MONTH,DAY_OF_MONTH,HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获取下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元年(即格林尼治时间1970年1月1日00:00:00:000,格里高利历)的偏移量。
java.util.Date
是最常用的日期时间处理类,且Date
类是一个普通类。
1.1、java.util.Date类对象的实例化
java.util.Date
类提供两个构造方法来实例化对象,分别为:
构造方法 | 构造方法说明 | 构造方法类型 |
---|---|---|
Date() |
使用当前日期和时间初始化Date对象 | 无参构造方法 |
Date(long date) |
使用传入的long型参数初始化Date对象,该参数的数值应该代表以格林尼治时间的1970年1月1日零时零分零秒 开始,到某一时刻所历经的毫秒值 |
含参构造方法 |
例1.创建无参和含参的Date对象
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
Date date1 = new Date();// 使用无参构造方法,实例化的Date对象为当前的日期和时间
System.out.println("date1 = " + date1);
Date date2 = new Date(0);// 使用传入一个指定毫秒值的构造方法,实例化的Date对象为指定毫秒值代表的日期和时间
System.out.println("date2 = " + date2);
}}
执行输出结果:
date1 = Tue Oct 13 21:58:32 CST 2020
date2 = Thu Jan 01 08:00:00 CST 1970
解释:
本例中分别使用了java.util.Date
类提供的两个构造方法来实例化对象
其一为无参的构造方法,实例化的对象为当前日期和时间;
其二为需要传入一个毫秒值的构造方法,本例中传入的毫秒值为0,故实例化的对象表示的时间为格林尼治时间的1970年1月1日零时零分零秒。
实际上,java.util.Date
类的无参构造方法的实现中,也是调用了传入毫秒值的含参构造方法,代码如下:
public Date() {
this(System.currentTimeMillis() ); }
上面的代码中,System.currentTimeMillis()
可以获得以格林尼治时间的1970年1月1日零时零分零秒开始,到系统当前时间所历经的毫秒值。
观察本例中的执行输出结果,应该可以觉察到,java.util.Date
类中重写了继承自java.lang.Object
类的toString()
方法,重写后,java.util.Date
类的对象打印格式为:
星期英文缩写 月份英文缩写 当月第几天 时:分:秒 时区 年份
本例中的CST
代表中国标准时间(China Standard Time UT+8:00
),由于中国使用的时区为东8区,因此要比格林尼治时间早8个小时。
1.2、java.util.Date类中的常用API
java.util.Date
类中的一些常用API
如下:
方法 | 返回值类型 | 方法说明 |
---|---|---|
getTime() | long | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此Date象表示的毫秒数 |
setTime(long time) | void | 用自 1970 年 1 月 1 日 00:00:00 GMT以后毫秒数设置时间和日期 |
hashCode() | int | 返回此对象的哈希码值 |
toString() | String | 返回此对象的字符串形式 |
after(Date date) | boolean | 若当调用此方法的Date对象在指定日期之后返回true,否则返回false |
before(Date date) | boolean | 若当调用此方法的Date对象在指定日期之前返回true,否则返回false |
equals(Object date) | boolean | 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false |
clone() | Object | 返回此对象的副本compareTo(Date anotherDate) |
注意:
Object
类的hashCode
.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。String
类的hashCode
.根据String
类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。Integer
类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100)
,i1.hashCode
的值就是100 。由此可见,2个一样大小的Integer
对象,返回的哈希码也一样。
例2.Date类的常用API的使用
import java.util.Date;
public class Test2 {
public static void main(String[] args) {
Date date = new Date();
// 使用setTime(long time)方法设置时间
date.setTime((38 * 365 + 9 + 220) * 24 * 3600 * 1000L);
// 打印getTime()方法获得的数值
System.out.println("date.getTime() = " + date.getTime());
// 打印时间,打印时会调用toString()方法
System.out.println("date = " + date);
}