我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java时间戳类Instant的使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java时间戳类Instant的使用详解

前言

在JAVA8之前的版本,去获取时间戳(毫秒级别)常用的办法有两种

// 方法一:构建日期Date类然后调用getTime方法
Date date = new Date();
System.out.println(date.getTime());

// 方法二:使用System类静态方法获取
System.out.println(System.currentTimeMillis());

由于Date类大部分方法已经废弃,而且上面两种方法的时间戳只能精确到毫秒级别,所以我们有必要了解下jdk1.8推出的Instant类,该类可以将时间戳精确到纳秒级别。

Instant类

时间点

该类对象表示的是时间线上的一点,这个时间点存在标准的UTC时间,注意这个时间并不是指北京时间或东京时间而是指世界时间

// 获取当前时间 2022-09-26T03:12:58.517Z(比当地时间相差8个小时)
System.out.println(Instant.now());

// 获取系统默认时间戳 2022-09-26T11:12:58.517+08:00[Asia/Shanghai]
System.out.println(Instant.now().atZone(ZoneId.systemDefault()));

在Instant时间线上存在三个重要的点位,最大点、最小点、原点也就是说小于1970-01-01的时间戳就为负数,超过1970-01-01的时间戳就为正数

// 时间线上最大点  +1000000000-12-31T23:59:59.999999999Z
System.out.println(Instant.MAX);

// 时间线上最小点  -1000000000-01-01T00:00:00Z
System.out.println(Instant.MIN);

// 时间线上原点   1970-01-01T00:00:00Z
System.out.println(Instant.EPOCH);

// 输出结果为-8369623
System.out.println(Instant.parse("1969-09-26T03:06:17.323Z").getEpochSecond());

时间表示

在Instant中采用两个字段表示时间戳


private final long seconds;

private final int nanos;

Instant实例化

普通实例化分为如下几种

// 获取当前时间
Instant instant1 = Instant.now();

// 字符串转Instant
Instant instant2 = Instant.parse("2022-09-26T03:46:24.373Z");

// 构建秒级Instant对象,从时间1970-01-01T00:00:00Z开始计算(距离原点5000秒)
// 结果为:1970-01-01T01:23:20Z
Instant instant3 = Instant.ofEpochSecond(5000);

// 构建毫秒级Instant对象,同样从时间1970-01-01T00:00:00Z开始计算(距离原点5000毫秒)
// 结果为:1970-01-01T00:00:05Z
Instant instant4 = Instant.ofEpochMilli(5000);

还有一种特殊的如下,可以构建纳秒级的Instant对象

// 构建纳秒级Instant对象,同样从时间1970-01-01T00:00:00Z开始计算
// 参数:epochSecond(秒),nanoAdjustment(纳秒)
// 结果为:1970-01-01T00:00:05.000001111Z
Instant instant5 = Instant.ofEpochSecond(5, 1111);

不过我们需要注意Instant.ofEpochSecond方法的源码,如下

static final long NANOS_PER_SECOND = 1000_000_000L;

public static Instant ofEpochSecond(long epochSecond, long nanoAdjustment) {
    // Math.floorDiv是除法运算,返回小于或等于商的整数 Math.floorDiv(25, 3)=8
    // Math.addExact加法运算,Math.addExact(1, 2)=3
    long secs = Math.addExact(epochSecond, Math.floorDiv(nanoAdjustment, NANOS_PER_SECOND));
    // Math.floorMod是模运算,Math.floorMod(9, 20)=9
    int nos = (int)Math.floorMod(nanoAdjustment, NANOS_PER_SECOND);
    return create(secs, nos);
}

Instant获取参数

Instant instant = Instant.now();
// 时区相差8小时 2022-09-26T07:04:19.110Z
System.out.println(instant);

System.out.println("秒:"+instant.getEpochSecond());

System.out.println("毫秒:"+instant.toEpochMilli());
// 1毫秒 = 1000 000 纳秒
System.out.println("纳秒:"+instant.getNano());

Instant时间点比较

由于时间点位于时间线上,所以可以直接进行对比。

Instant instant1 = Instant.parse("2022-09-26T07:04:19.110Z");
Instant instant2 = Instant.parse("2022-09-26T07:04:19.110Z");
Instant instant3 = Instant.parse("2022-08-26T07:04:19.110Z");

// 相等为0
System.out.println(instant1.compareTo(instant2));
// instant1大于instant3 为1
System.out.println(instant1.compareTo(instant3));
// instant1小于instant3 为-1
System.out.println(instant3.compareTo(instant1));

// true
System.out.println(instant1.isAfter(instant3));
// false
System.out.println(instant1.isBefore(instant3));

Instant时间点运算

Instant instant1 = Instant.parse("2022-09-26T07:04:19.110Z");

// 在instant1的基础上增加2秒,值为:2022-09-26T07:04:21.110Z
System.out.println(instant1.plusSeconds(2));

// 在instant1的基础上增加1毫秒,值为:2022-09-26T07:04:19.111Z
System.out.println(instant1.plusMillis(1));

// 在instant1的基础上增加1001纳秒,值为:2022-09-26T07:04:19.110001001Z
System.out.println(instant1.plusNanos(1001));

// 在instant1的基础上增加1秒,值为:2022-09-26T07:04:20.110Z
// 该值取决于后面指定的单位,可以从ChronoUnit枚举类获取
System.out.println(instant1.plus(1, ChronoUnit.SECONDS));

// 在instant1的基础上减去1秒,值为:2022-09-26T07:04:18.110Z
// plus是增加,minus是减少,逻辑类似可以参考上面plus相关A
System.out.println(instant1.minusSeconds(1));

Instant时间点计算时需要注意,无论是调用plus或者minus相关API都会重新创建新对象。

到此这篇关于Java时间戳类Instant的使用详解的文章就介绍到这了,更多相关Java时间戳类Instant内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java时间戳类Instant的使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java DateUtil工具类时间戳类型转换详解

本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下package com.sinosoft.media.sms.util; import java.text.ParseException; impo
2023-05-30

Java中时间戳的使用

原文链接 当前时间 import java.sql.Timestamp; //导包Timestamp nowTime = new Timestamp(System.currentTimeMillis());System.out.printl
2023-08-30

C#时间戳基本使用方法详解

这篇文章主要给大家介绍了关于C#时间戳基本使用方法的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友可以参考下
2022-11-13

mysql之TIMESTAMP(时间戳)用法详解

TIMESTAMP是MySQL中用来存储和操作日期和时间的数据类型之一。它可以存储从1970年1月1日00:00:00到2038年1月19日03:14:07之间的时间戳。在MySQL中,TIMESTAMP数据类型有以下特点和用法:1. 存储
2023-08-08

使用java怎么获取整点的时间戳

本篇文章给大家分享的是有关使用java怎么获取整点的时间戳,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We
2023-06-06

Java java.sql.Timestamp时间戳使用要注意什么

使用Java中的java.sql.Timestamp类表示时间戳时,需要注意以下几点:1. 时间戳是一个特殊的时间数据类型,用于表示从1970年1月1日00:00:00 GMT以来的毫秒数。因此,在计算时间戳时需要确保输入的时间是以GMT时
2023-08-09

怎么使用Java获取当前时间戳

今天小编给大家分享一下怎么使用Java获取当前时间戳的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。要获取Java中的当前时间
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录