概述
背景
Instant是JKD1.8中新增的日期API,简要说下Java中日期APi的背景。
早在JDK1.0时代,JDK就包含了一个与时间相关的java.util.Date类,而因为其本身的缺陷,其大多数方法都在JDK1.1时代被新引入的与时间相关的Calendar类取代。而Calendar类并不比Date类好太多,其本身也有不少问题。譬如:
- Calendar类是可变的,即可以直接修改内部储存的时间值,而日期时间这类属性应更类似于字符串String,具有不可变性才较为合理。
- Date的起始年份都按1900年开始计算,而Date与Calendar的月份都以0开始计算,这与人的直觉和其他属性的计算方式有冲突,我们称其为偏移量。
- 我们知道有个SimpleDateFormat类可以对日期进行格式化操作,而这个类只能直接操作Date类,对于后来加入并取代Date类大部分方法的Calendar类并不能直接操作。
- 上述类都不是线程安全的。
对于第二点的代码解释:
Date date = new Date(2077,6,1);
// Fri Jul 01 00:00:00 CST 3977
System.out.println(date);
// 年份从1990年开始计算:偏移量,月份从0开始,表示9月应该是8
注意存储的年份并不是2077,而是1900+2077;而月份也并不是6月,而是6-1月。这种操作逻辑就与人的直觉产生了冲突。
为了解决上述问题,JDK1.8中新增了许多与时间相关的新的API,Instant类就是其中之一。
用法
Instant类的功能类似于JDK1.8之前的util.Date类。
实例化
实例化方式比较特殊,不能直接通过new的方式进行实例化。需要调用now()方法,该方法返回一个记录当前格林威治标准时间的Instant对象的引用。
Instant instant = Instant.now();
System.out.println(instant);
// 按格林威治时间记录,即零时区:2020-06-27T01:47:37.253Z
常用方法
atOffset(ZoneOffest offest):
我们更习惯于使用北京时间,即东八区时间。因此需要对Instant实例化对象进行偏移量的设置。
通过调用ZoneOffest类的静态方法ofHours(int n),传入一个数值即可设置偏移的小时量。该方法返回一个OffsetDateTime对象的引用。
// 按时区设置偏移量,
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 设置偏移量为8
System.out.println(offsetDateTime); // 这个对象也可以直接打印:2020-06-27T09:47:37.253+08:00
toEpochMilli():
获取1970年1月1日至所记录时间的的毫秒数,类似于Date.getTime()。
long l = instant.toEpochMilli();
System.out.println(l); // 1593222457253
ofEpocMilli(long epochMilli):
Instant类的静态方法,严格来说这也算实例化的一种方式:通过给定的毫秒数,获取Instant实例,类似于Date类的其一构造器。
Instant instant1 = Instant.ofEpochMilli(l);
System.out.println(instant1); // 2020-06-27T01:47:37.253Z
Instant类比较简单,使用上也类似于JDK1.8之前的Date类,区别在于对Date类做了一定的改进以及一般搭配JDK1.8新增的其他几个日期API进行使用。
最后
以上就是时尚小鸭子为你收集整理的[Java] Instant类介绍与应用背景用法的全部内容,希望文章能够帮你解决[Java] Instant类介绍与应用背景用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复