文章目录
一、介绍
Date类是一个JDK写好的JavaBean类,用来描述时间,精确到毫秒。
如果我们利用空参构造去创建它的对象,默认是表示系统的当前时间。(这里的系统指的就是你的操作系统)
如果我们利用有参构造去创建对象,就表示是指定的时间。
二、自己动手写一个Date类
现在,知道了这些信息,其实我们可以用我们以前写 JavaBean 的规则自己去写一个Date类。
首先名字,肯定要叫做 Date
,它表示就是用来描述时间的。

里面会有一些属性,属性我就可以写 long类型
的 time
,它就表示当前时间的毫秒值,其实就是表示:从时间原点开始,过了这么多毫秒的时间点。
计算机的时间原点: 1979年1月1日 00:00:00
,而我们天朝大国是在东八区,因此需要在这个基础上加 8

再往下,就是对应的空参构造和带参构造,在空参构造里面,我们可以利用 System.currentTimeMillis()
获取到当前现在这个时间的毫秒值,再把毫秒值赋值给成员变量 time
就行了。
那如果是有参构造的话,我可以直接传递一个参数过来,把它再去赋给成员变量 time
就行了。

当然,如果我们自己写JavaBean类的话,还要有对应的 get
跟 set
方法。

以上就是我们自己写的 Data类
去描述时间。
那我告诉你,Java其实也是这么写的,回到IDEA中,我们简单来阅读一下源码。
三、阅读源码
ctrl + N 输入 Date,然后右上角选择 All Places
,找到 java.util包
下的 Date

首先,在这个类中,我们要来看一下它的成员变量,名字:fastTime
,类型是 long
,这个变量就是表示时间的毫秒值。
再往下,我们可以看一下它的空参构造,ctrl + F12 往上拖

在空参构造中,是不是跟我们一样,也是用 System.currentTimeMillis()
去获取到当前时间的毫秒值,然后把这个数据传递给本类的其他构造,这个构造就是下面 180行
这里的有参构造。
在有参构造中,它就将你当前传递过来的毫秒值赋值给成员变量 fastTime
。
除此之外,它还有对应的 get
、set
方法,ctrl + F12 来找一下这个 get
,这个 get方法
叫 getTime()

在底层它会调用另外一个方法,但是另外一个方法最终返回的就是当前的时间的毫秒值 fastTime

再往下,还有一个 setTime
,这个方法就是在赋值
所以Java它其实也是这么写的,知道源码后,我们再去学习 Date类
就非常轻松了。
在这里只需要大家掌握这四个方法就行了。
四、成员方法
首先我们要知道,我们如何利用构造方法去创建 Data对象
表示一个时间
public Date()
:创建Date对象
,表示当前时间public Date(long date)
:创建Date对象
,表示指定时间
其次还需要知道我如何 修改 / 获取
时间的毫秒值
public long getTime()
:获取时间对象的毫秒值public void setTime(long time)
:设置 / 修改毫秒值
1)创建对象表示系统时间
空参构造表示的是当前的系统时间
Date d1 = new Date();
System.out.println(d1);
运行结果如下图

2)创建对象表示一个指定的时间
直接将指定的毫秒值传递进去就行了,获取到的是:从时间原点开始,过了 XXX毫秒
的时间。
PS:创建对象要导的是 java.util
包下的,不要导成 java.sql
包了,sql
包是跟数据库相关的。

括号中直接写 0
就可以了,但是在这会有一个小细节:它的类型是 long
,因此我们在书写的时候后面最好加一个 L

下面这句话的意思就是:从时间原点开始,过了 0毫秒
的时间,即:时间原点,
Date d2 = new Date(0L);
System.out.println(d2);
程序运行结果如下,计算机的时间原点: 1979年1月1日 00:00:00
,而我们天朝大国是在东八区,因此需要在这个基础上加 8

3)setTime()
—— 修改时间
方法需要传递一个毫秒值,因此我们需要将 long
类型的数据传递进去,注意不要忘记加 L
d2.setTime(1000L);
System.out.println(d2);
程序运行结果如下图,修改完之后,它就表示从时间原点开始,过了 1000毫秒
的时间。
在刚刚我们说了:1000毫秒 = 1秒

4)getTime()
—— 获取当前时间的毫秒值
long time = d2.getTime();
System.out.println(time);
程序运行结果如下

那 getTime()
有什么作用呢?我们通过一个小练习来说明。
5)练习:时间计算
第一个需求就是要让我们拿着时间进行计算了
需求1:打印时间原点开始一年之后的时间
第二个需求就是要让我们进行时间的比较
需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后
在这两个需求中,你是不能直接拿着 Date对象
去操作的,因为 Date
是一个对象,它是不能直接加减乘除的。
此时就要来思考:在Java中,谁可以直接加减乘除?是不是整数、小数这些。
因此如果我们想要实现上面这两个效果,需要先将时间的毫秒值获取出来,然后我们就可以进行 加 / 比较
。
① 需求1:打印时间原点开始一年之后的时间
第一步:需要创建一个对象,表示时间原点。
再强调一下,导包一定要导 java.util
包下的。
括号中如果什么都没写,那就表示系统的当前时间。
Date d1 = new Date();
但我现在想要的不是这个,我想要的是时间原点,因此在括号中我们需要写 0L
。
Date d1 = new Date(0L);
第二步:获取 d1
时间的毫秒值
long time = d1.getTime();
第三步:在这个基础上我们要加一年的毫秒值即可
乘1000L
表示 1s
,再乘 60
表示 1秒
,再乘 60
表示 1分钟
,再乘 24
表示 1天
,再乘 365
表示 1年
time + 1000 * 60 * 60 * 24 * 365;
但是在计算的过程中,我们要留个心眼,后面的这段数据它记录出来的结果,有可能比 int
的取值范围要大,如果比 int
大了,它的结果就会有误,因此在 1000
的后面我们要加个 L
,表示所有的数据在计算的时候,都以 long
类型的为准。
计算完后,再将计算的结果交给 time
time = time + 1000 * 60 * 60 * 24 * 365;
第四步:将计算之后的时间毫秒值,再设置回 d1
当中
d1.setTime(time);
第五步:打印 d1
System.out.println(d1);
程序运行结果如下:时间原点开始一年之后的时间
② 需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后
第一步,肯定是定义两个 Date对象
,里面传的参数用一个随机的整数进行表示。
在随机数中,如果我没有指定范围,就会在 int
的取值范围之内去获取一个随机数。
Date d1 = new Date(r.nextInt());
由于这个数据我想让它是一个非负数,所以可以使用 Math.abs()
Date d1 = new Date(Math.abs(r.nextInt()));
Date d2 = new Date(Math.abs(r.nextInt()));
第二步,就可以来比较时间了的大小了
但如果直接使用对象比较,是会报错的:运算符“>”不能应用于 "java.util.Date"、"java.util.Date"
。
因为 d1
跟 d2
这两个是对象,对象是不能直接进行 加减乘除、比较等操作
。
此时就需要先将它的毫秒值获取出来
long time1 = d1.getTime();
long time2 = d2.getTime();
因为毫秒值是基本数据类型,基本数据类型就可以直接进行 加减乘除、比较等操作
。
if (time1 > time2) {
System.out.println("第一个时间在后面,第二个时间在前面");
} else if (time1 < time2) {
System.out.println("第二个时间在后面,第一个时间在前面");
} else {
System.out.println("表示两个时间一样");
}
五、总结
1、如何创建日期对象?
使用空参构造:表示当前的系统时间
Date date = new Date();
使用带参构造:表示一个指定的时间,括号中传递的是时间的毫秒值。
获取到的是:从时间原点开始,过了 XXX毫秒
的时间。
Date date = new Date(指定毫秒值);
2、如何修改时间对象中的毫秒值
用一个 set方法
即可
setTime(毫秒值);
3、如何获取事件对象中的毫秒值
同样的,用一个 get方法
就行了。
当我将时间的毫秒值获取出来之后,就可以进行 计算、比较....
操作
getTime();