每日一例 | 你真的了解日期时间类吗?

云中志

共 2910字,需浏览 6分钟

 · 2021-05-23


前言

日期和时间是我们在日常开发中经常用到的数据类型,但是很多时候我们获取日期和时间的方式并不合理,特别是在多线程环境中会有一些问题,为了能够更合理地使用他们,我们首先要了解他们的常用方法和基本用法,今天我们就来看下如何合理地获取日期时间。

Date

date这个类,是我们日常获取日期时间最主要的类,也是我们比较熟悉的类,常用的构造方法有很多,但绝大部分以及被弃用了:

接下来,我们就来看下这些没有被弃用的方法的常用用法。

构造方法

目前可以用的构造方法有两个,Date()Date(long date),从源码来看,第一个构造方法调用了第二个构造方法:

常用方法

getTime()

获取当前日期的毫秒时间。根据构造方法的描述,java日期时间的起点是1970-01-01 00:00:00,所以获取1970-01-01 00:00:00的毫秒时间的值应该是0,但由于它指定的时区是GMT,也就是零时区,中国位于东八区(GMT+8),所以在不指定时区的情况下,在中国直接获取的时间毫秒并不是0,而是负8小时的毫秒数,也就是-28800000

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date parse = dateFormat.parse("1970-01-01 00:00:00 GMT");
System.out.println(parse.getTime());
System.out.println(new Date().getTime());

输出结果:

setTime()

这个方法就是设定日期的毫秒时间。setTime(0),就是1970-01-01 00:00:00。这里的时间指的就是当前时区的时间。

 Date x = new Date();
 x.setTime(0);
 System.out.println(x);

结果:

Thu Jan 01 08:00:00 CST 1970
before()

咋感觉像是发现新大陆了呢?实话实说,以前比较实际先后顺序都是自己手动写,第一次发现官方已经提供了。

Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.before(date2));

返回结果:

true

当然,你也可以自己写,也很简单,但是用现成的,它不香吗?

after()

刚好和before相反,实现方法也就是小于改成大于。

 Date date1 = new Date();
 Date date2 = new Date(date1.getTime() + 1);
 System.out.println(date1.after(date2));

返回结果

flase
equals

这里它重写了equals方法,比较的是两个日期的毫秒时间

Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.equals(date2));

返回结果false

compareTo

比较两个日期,如果当前日期小于传入的日期,返回-1,如果两个日期时间相等,返回0,否则返回1

Date date3 = new Date();
Date date4 = new Date(date1.getTime() + 5);
System.out.println(date3.compareTo(date4));

返回-1

from

这个方法是jdk1.8引入的一个方法,它是一个静态方法,方法的作用是从Instant对象中获取日期时间,Instant类也是jdk1.8引入的一个类,它是一个final类,jdk1.8还有一个不太为人所知的特性就是加强了对日期时间的支持。

Instant instant = Instant.now();
System.out.println(Date.from(instant));

输出结果:

Sat May 22 11:27:15 CST 2021
toInstant

这个方法同样是jdk1.8引入的,作用和from刚好相反。但这个方法并非静态方法。

Instant instant1 = date1.toInstant();
System.out.println(instant1);

输出结果

2021-05-22T03:30:20.977Z

Date类到这里就结束了。

总结

鉴于时间的关系,今天我们就到这里吧。今天我们就分享了Date类常用的一些方法和用法,确实也get到两个我以前不知道的知识点,对,就是beforeafter,而且我也确认了不是jdk1.8新增的方法,你学到了吗?

另外再补充下,未来一段时间,我打算继续挖掘jdk1.8对于日期时间增强的一些知识点,发现这里的知识点还是蛮多的,这里先做一个简单的预告,未来持续更新:

  • format相关的类

  • 枚举类:DayOfWeekMonth

  • 其他常用的类:ClockDurationInstantLocalDateLocalDateTimeLocalTimeMonthDayOffsetDateTimeOffsetTimePeriodSerYearYearMonthZonedDateTimeZoneIdZoneOffsetZoneRegion

一梳理,发现涉及的内容还是蛮多的,不过没关系,我们来日方长……加油!

项目路径:

https://github.com/Syske/example-everyday

本项目会每日更新,让我们一起学习,一起进步,遇见更好的自己,加油呀

- END -


浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报