我是靠谱客的博主 时尚小鸭子,最近开发中收集的这篇文章主要介绍[Java] Instant类介绍与应用背景用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景

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类介绍与应用背景用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部