常用类库之Java.util.Date详解

Java中常用日期类Date详解

Date类概述–JDK11API

Date类表示特定的时刻,精度为毫秒。

public class Date
extends Object
implements Serializable, Cloneable, Comparable<Date>

根据Datel类的创建时的声明可知Date类是可序列化的,可克隆的,和可以比较的,有固定的比较顺序。


在JDK 1.1之前, Date类还有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和秒值。 它还允许格式化和解析日期字符串。 不幸的是,这些功能的API不适合国际化。 从JDK 1.1开始, Calendar类应该用于在日期和时间字段之间进行转换,而DateFormat类应该用于格式化和解析日期字符串。 不推荐使用Date中的相应方法。


在接受或返回年,月,日,小时,分钟和秒值的所有Date类方法中,使用以下表示:

  • 一个月由0到11的整数表示; 0是1月,1是2月,依此类推; 因此11月是12月。
  • 小时由0到23之间的整数表示。因此,从午夜到凌晨1点的小时是小时0,从中午到下午1点的小时是小时12。
  • 一分钟由通常方式的0到59的整数表示。

创建Date对象

Date()

此方法创建的为当前时间的Date对象

源码:
public Date() {
	this(System.currentTimeMillis());
//注释:System.currentTimeMillis() 可以获得当前时间的毫秒数
}
Date()方法的使用:
Date()   分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒。 
Date date = new Date();
System.out.println(date);
打印结果:Sun Jan 24 00:47:54 CST 2021

Date对象的默认格式为 “星期几 月 日 时:分:秒 地区 年份”
CST 意思是 China Standard Time 中国标准时间,也就是北京时间,东八区。

Date(long time)

此方法可以创建指定的时间的Date对象,通过给定的毫秒数来设置指定的时间(注:毫秒数为当前时间与1970年1月1日00:00:00 GMT的时间差,但由于我们在东八区实际上是与1970年1月1日00:08:00的差值)

源码:
public Date(long date) {
	fastTime = date;
}
方法的使用:
Date(long time) 分配 Date对象并初始化它以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即19701100:00:00 GMT。 
long time1 = 1611420846276L;
Date date1 = new Date(time1);
System.out.println(date1);
打印结果:Sun Jan 24 00:54:06 CST 2021
这里面要注意 time 赋值的 long类型的数字已经超过了int 的存储范围,要在数字后面加上L,不然会报错"Integer number too large".

但我们一般很少直接写个如此之大的毫秒数来设置时间。下面给定一种新的设置时间的格式。
long time2 = System.currentTimeMillis();
//注释:System.currentTimeMillis() 可以获得当前时间的毫秒数
System.out.println(time2);
Date date2 = new Date(time2);
System.out.println(date2);
打印结果:1611422082340    Sun Jan 24 01:14:42 CST 2021

后面我们学习Calendar类和DateFormat类,我们还有更多的生成Date的方式,比如通过字符串输入指定时间来生成该时间的Date对象等等,但是都是调用的Date() 和 Date(long time)这两种方法。

Date类的常用方法(非过时的方法)

方法after(Date when)

源码:
public boolean after(Date when) {
	return getMillisOf(this) > getMillisOf(when);
}

根据源码不难看出,此方法返回值的数据类型为 boolean。
此方法的作用是测试Date对象的日期是否在指定日期之后。
结果:true当且仅当此Date对象所代表的时刻严格晚于when代表的when ; 否则为false 。

after(Date when)方法的使用:
//使用之前创建过得date1和date2
boolean test1 = date1.after(date2);
System.out.println(test1);
打印结果: false  // 表示date1 早于 date2
可能发生的异常:NullPointerException - 如果 when为空。

方法before​(Date when)

源码:
public boolean before(Date when) {
	return getMillisOf(this) < getMillisOf(when);
}

此方法的返回值的数据类型为 boolean。
作用:测试此日期是否在指定日期之前。
结果:true当且仅当此Date对象所代表的时刻严格早于when代表的when ; false否则。

before(Date when)方法的使用:
//使用之前创建过得date1和date2
boolean test2 = date1.before(date2);
System.out.println(test2);
打印结果: true

可能出现的异常:NullPointerException - 如果 when为空。 

方法compareTo(Date anotherDate)

源码:
public int compareTo(Date anotherDate) {
	long thisTime = getMillisOf(this);
	long anotherTime = getMillisOf(anotherDate);
	return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
//如果thisTime小则返回-1,相等返回0,大于返回1.

此方法返回值数据类型为 int。
作用:比较两个Date对象的顺序。

compareTo(Date anotherDate)方法的使用:
//使用之前创建过得date1和date2
int order = date1.compareTo(date2);
System.out.println(order);
打印结果: -1    // 表示date1的顺序在date2之前 即date1早于date2

可能放生的异常:NullPointerException - 如果 anotherDate为空。

方法equals​(Object obj)

public boolean equals(Object obj) {   // obj - 要与之比较的对象。 
	return obj instanceof Date && getTime() == ((Date) obj).getTime();
}

此方法的返回值的数据类型为 boolean。
此方法的作用:比较两个Date对象的内容即时间毫秒数是否相等。
结果:true如果对象相同; 否则为false 。

equals(Object obj)方法的使用:
//使用之前创建过得date1和date2
boolean test3 = date1.equals(date2);
打印结果:false     // 表示两个Date对象的时间不相等

方法getTime()

源码:
public long getTime() {
	return getTimeImpl();  
}
//调用的这个方法是私有的不细究了,大概作用是判断时间是否是标准化时间,如果不是则变成标准化的时间再返回对应的毫秒数,涉及到Calendar类

此方法的返回值的数据类型为 long。
作用为:返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。

getTime()方法的使用:
//使用前面创建的对象date1
long getTime = date1.getTime();
System.out.println(getTime);
打印结果: 1611420846276    //与前面创建date1时赋值的毫秒数一致

方法setTime​(long time)

源码:
public void setTime(long time) {
	fastTime = time;
	cdate = null;
}

此方法的类型为void 不返回值
作用:将此 Date对象设置为表示格林威治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点。
参数:time - 毫秒数。

setTime(long time)方法的使用:
//使用前面创建的对象date1与date2,变量time1
System.out.println(date1.equals(date2)?"date1与date2时间相同":"date1与date2时间不相同");
date2.setTime(time1);
System.out.println(date1.equals(date2)?"date1与date2时间相同":"date1与date2时间不相同");
打印结果: date1与date2时间不相同   date1与date2时间相同  //说明date2调用setTime()方法后时间已经变为date1的时间了。

Date类中的不常用方法简介

方法clone()

public Object clone()
是对Object类里的clone()方法的重写
方法返回此对象的副本
结果:这个实例的克隆。
源码涉及到的类暂时接触不到就不放了。
clone方法的本质是把当前对象的内容复制并赋值给一个新的Date对象,因此返回的副本与本体拥有同样的时间毫秒数,但是副本地址是不等于本体的。

验证 clone()方法:
//使用前面创建的对象date1
Date date3 = (Date) date1.clone();
System.out.println(date1 == date3);
System.out.println(date1.equals(date3));
打印结果: false  true  // false表示两者地址不同即克隆出来的对象拥有新的地址, true表示两者内容相同

方法from​(Instant instant)

public static Date from(Instant instant)
作用:从 Instant对象获得 Date的实例。 Instant使用的精度为纳秒,而Date使用的精度为毫秒。 转换将截断任何多余的精度信息,就好像以纳秒为单位的整数除以一百万。 Instant可以在未来的时间线上存储积分,并且远大于Date 。 在这种情况下,此方法将引发异常 IllegalArgumentException - 如果瞬间太大而无法表示为 Date
参数 instant - 时间的瞬间 纳秒
结果:方法返回一个Date对象,Date表示时间线上与提供的瞬间相同的点
从java 1.8 版本开始
此方法目前阶段基本上用不到就不展示运用了。

方法 hashCode()

public int hashCode()
作用:返回此对象的哈希码值。 结果是getTime()方法返回的原始long值的两半的异或。 也就是说,哈希码是表达式的值:
(int)(this.getTime()^(this.getTime() >>> 32))
是对类 Object 中 hashCode 方法的重写
结果:此对象的哈希码值。
源码编译器可以自动生成,基本上是为了实现哈希表,基本上用不到就不展示了。

方法toInstant()

public Instant toInstant()
作用:将此Date对象转换为Instant 。
结果 :表示时间线上与此 Date对象相同的点的瞬间
从 java 1.8 开始
因为次方法涉及到的类基本上用不到所以源码和方法使用的展示就不写了

方法toString()

public String toString()
源码涉及到许多暂时没学过且用不到的类,就不展示了
作用:将此Date对象转换为以下形式的String :
dow mon dd hh:mm:ss zzz yyyy
解释:
-dow是星期几( Sun, Mon, Tue, Wed, Thu, Fri, Sat )的。
-mon是个月( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec )。
-dd是该月的第几天( 01到31 ),以小数点后两位数。
-hh是一天中的小时( 00到23 ),以小数点后两位数。
-mm是小时内的分钟( 00到59 ),以小数点后两位数。
-ss是分钟内的第二个( 00到61 ,两位十进制数字。
-zzz是时区(可能反映夏令时)。 标准时区缩写包括方法parse识别的缩写。 如果时区信息不可用,则zzz为空 - 也就是说,它根本不包含任何字符。
-yyyy是年份,四位数。

toString()方法的使用:
//使用前面已创建的对象date1
System.out.println(date1.toString());
打印结果: Sun Jan 24 00:54:06 CST 2021

该方法不常用的原因是格式过于复杂,后面我们在DateFormat类里可以设置更简单的日期转换成字符串的格式比如 “yyyy-MM-dd” 年月日的字符串显示等等格式。

已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页