【Java】Date时间类

一、介绍

Date类是一个JDK写好的JavaBean类,用来描述时间,精确到毫秒。

如果我们利用空参构造去创建它的对象,默认是表示系统的当前时间。(这里的系统指的就是你的操作系统)

如果我们利用有参构造去创建对象,就表示是指定的时间。


二、自己动手写一个Date类

现在,知道了这些信息,其实我们可以用我们以前写 JavaBean 的规则自己去写一个Date类。

首先名字,肯定要叫做 Date,它表示就是用来描述时间的。

image-20240423164842429

里面会有一些属性,属性我就可以写 long类型time,它就表示当前时间的毫秒值,其实就是表示:从时间原点开始,过了这么多毫秒的时间点。

计算机的时间原点: 1979年1月1日 00:00:00,而我们天朝大国是在东八区,因此需要在这个基础上加 8

image-20240423165115392

再往下,就是对应的空参构造和带参构造,在空参构造里面,我们可以利用 System.currentTimeMillis() 获取到当前现在这个时间的毫秒值,再把毫秒值赋值给成员变量 time 就行了。

那如果是有参构造的话,我可以直接传递一个参数过来,把它再去赋给成员变量 time 就行了。

image-20240423165326364

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

image-20240423165421695

以上就是我们自己写的 Data类 去描述时间。

那我告诉你,Java其实也是这么写的,回到IDEA中,我们简单来阅读一下源码。


三、阅读源码

ctrl + N 输入 Date,然后右上角选择 All Places,找到 java.util包 下的 Date

image-20240423165949868

首先,在这个类中,我们要来看一下它的成员变量,名字:fastTime,类型是 long,这个变量就是表示时间的毫秒值。

再往下,我们可以看一下它的空参构造,ctrl + F12 往上拖

image-20240423170317311

在空参构造中,是不是跟我们一样,也是用 System.currentTimeMillis() 去获取到当前时间的毫秒值,然后把这个数据传递给本类的其他构造,这个构造就是下面 180行 这里的有参构造。

在有参构造中,它就将你当前传递过来的毫秒值赋值给成员变量 fastTime

image-20240423170456838

除此之外,它还有对应的 getset 方法,ctrl + F12 来找一下这个 get,这个 get方法getTime()

image-20240423171507197

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

image-20240423171912438

再往下,还有一个 setTime,这个方法就是在赋值

image-20240423171956940

所以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);

运行结果如下图

image-20240423173301025

2)创建对象表示一个指定的时间

直接将指定的毫秒值传递进去就行了,获取到的是:从时间原点开始,过了 XXX毫秒 的时间。

PS:创建对象要导的是 java.util 包下的,不要导成 java.sql 包了,sql 包是跟数据库相关的。

image-20240423173348211

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

image-20240423173602960

下面这句话的意思就是:从时间原点开始,过了 0毫秒 的时间,即:时间原点,

Date d2 = new Date(0L);
System.out.println(d2);

程序运行结果如下,计算机的时间原点: 1979年1月1日 00:00:00,而我们天朝大国是在东八区,因此需要在这个基础上加 8

image-20240423173659978

3)setTime() —— 修改时间

方法需要传递一个毫秒值,因此我们需要将 long 类型的数据传递进去,注意不要忘记加 L

d2.setTime(1000L);
System.out.println(d2);

程序运行结果如下图,修改完之后,它就表示从时间原点开始,过了 1000毫秒 的时间。

在刚刚我们说了:1000毫秒 = 1秒

image-20240423174003127

4)getTime() —— 获取当前时间的毫秒值

long time = d2.getTime();
System.out.println(time);

程序运行结果如下

image-20240423174522559

getTime() 有什么作用呢?我们通过一个小练习来说明。


5)练习:时间计算

第一个需求就是要让我们拿着时间进行计算了

需求1:打印时间原点开始一年之后的时间

第二个需求就是要让我们进行时间的比较

需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后

在这两个需求中,你是不能直接拿着 Date对象 去操作的,因为 Date 是一个对象,它是不能直接加减乘除的。

此时就要来思考:在Java中,谁可以直接加减乘除?是不是整数、小数这些。

因此如果我们想要实现上面这两个效果,需要先将时间的毫秒值获取出来,然后我们就可以进行 加 / 比较


① 需求1:打印时间原点开始一年之后的时间

第一步:需要创建一个对象,表示时间原点。

再强调一下,导包一定要导 java.util 包下的。

image-20240423175249452

括号中如果什么都没写,那就表示系统的当前时间。

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);

程序运行结果如下:时间原点开始一年之后的时间

image-20240423183331456

② 需求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"

image-20240423183901567

因为 d1d2 这两个是对象,对象是不能直接进行 加减乘除、比较等操作

此时就需要先将它的毫秒值获取出来

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();
  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值