8年了,这几个时间API你用过吗?
相信Java 8中的LocalDate
和LocalDateTime
大家都非常熟悉了,这些时间API用起来非常语义化,并且能够保证线程的安全性。今天介绍另外几个可能你不常用的时间API以及它们的使用场景,或许能够帮助你更好地进行开发。
Instant
最近我使用java.time.Instant
比较多,因为计算JWT的过期时间和发行时间都用的是它。有人会问为什么不使用LocalDateTime
呢?其实我也比较纳闷。经过一番查询才明白了为什么要使用Instant
。
时间是一条向前不断延伸的时间线。我们定义过期时间的时候肯定是一个瞬时时间点,而Instant
正好可以用来表示时间线上的一个时间戳,常用来记录事件时间戳。
Instant
的范围需要存储一个超过long
类型极限的数字,因此它被设计为两个部分:
seconds
从计算机元年(1970-01-01T00:00:00Z)开始的秒数,可能是负数哦。nanos
纳秒数,用来修正时间以保证准确性,始终是正数,而且小于999,999,999
。
常用API的使用
如果你使用Instant.now()
获取当前时间戳,采用的是UTC时间,并非北京时间。所以需要加上时区:
Instant issuedAt = Clock.system(ZoneId.of("Asia/Shanghai")).instant();
TemporalAccessor
的实现类,比如常用的LocalDate
、LocalDateTime
都可以转换为Instant
,例如:
Instant current = Instant.from(LocalDateTime.now());Instant instant = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8));
如果在计算机元年以前,需要用负值表示:
Instant instantBefore1970 = Instant.ofEpochSecond(-13434234, 343434);
还有其它一些API就不一一介绍了,请务必记住,它通常用来记录事件发生的瞬时时刻。
Duration
这是一个持续时间,通常表示持续了多少时间。它记录了一个时间量,可以来自一个开始时间和结束时间,也可以来自一些时间计量单位。它同样用秒数和纳秒来存储时间量,秒数同样可以是负数,纳秒只能是正数。
常用API的使用
比如你花了3天时间写了个需求:
Duration days = Duration.ofDays(3);
再精确点,从2022年4月2日到2022年4月5日,共3天:
Duration duration = Duration.between(LocalDateTime.of(2022, 4, 2,0,0),LocalDateTime.of(2022, 4, 5,0,0));
注意这里只能使用能够表示到秒的Temporal
实现,比如LocalDate
只能表示到天,是不行的。
❝
剩下的持续了多少年、多少月、多少分钟、多少小时、多少秒就不一一演示了。
格式化
格式基于 ISO-8601 持续时间格式PnDTnHnMn.nS
,其中天数被认为是 24 小时。字符串以可选符号开头,由 ASCII 负号或正号表示。如果为负,则整个周期都被否定。接下来是大写或小写的 ASCII 字母“P”。然后有四个部分,每个部分由一个数字和一个后缀组成。这些部分具有“D”、“H”、“M”和“S”的 ASCII 后缀,表示天、小时、分钟和秒,接受大写或小写。后缀必须按顺序出现。ASCII 字母“T”必须出现在小时、分钟或秒部分的第一次出现(如果有)之前。必须存在四个部分中的至少一个,如果存在“T”,则必须在“T”之后至少有一个部分。每个部分的数字部分必须由一个或多个 ASCII 数字组成。该数字可以以 ASCII 负号或正号为前缀。天数、小时数和分钟数必须解析为long 。秒数必须解析为带有可选分数的long整数。小数点可以是点或逗号。小数部分可能有 0 到 9 个数字。
实力
格式 | 含义 |
---|---|
PT20.345S
|
20.345秒 |
PT15M
|
15分钟 |
PT10H
|
10小时 |
P2D
|
2天 |
P2DT3H4M
|
2天3小时4分钟 |
P-6H3M
|
减6小时加3分钟,等于减5小时57分钟 |
-P6H3M
|
否定全部,减6小时3分钟 |
-P-6H+3M
|
加6小时减3分钟,等于持续5小时57分钟 |
Period
说到这里就不得不说一下Period
,感觉它和Duration
非常类似,只不过它建立在年月日上,以年、月和日为单位对时间量或时间量进行建模。非常容易理解这里就不细说了,记住它最多精确到天就够了,它同样是用来记录持续时间的,只不过粒度粗了一些。
常用API
持续了2年:
Period years = Period.ofYears(2);
// 其它时间单位就不演示了。
这里可以使用周进行初始化:
Period weeks = Period.ofWeeks(3);
新冠从2019年12月持续到2022年4月
Period covid19Period = Period.between(LocalDate.of(2019,12,1),LocalDate.of(2022,4,7));
格式化
基于 ISO-8601 句点格式PnYnMnD
和PnW
。字符串以可选符号开头,由 ASCII 负号或正号表示。如果为负,则整个周期都被否定。接下来是大写或小写的 ASCII 字母“P”。然后有四个部分,每个部分由一个数字和一个后缀组成。必须存在四个部分中的至少一个。这些部分具有“Y”、“M”、“W”和“D”的 ASCII 后缀,表示年、月、周和日,接受大写或小写。后缀必须按顺序出现。每个部分的数字部分必须由 ASCII 数字组成。该数字可以以 ASCII 负号或正号为前缀。该数字必须解析为int
。前导加号/减号和其他单位的负值不是 ISO-8601 标准的一部分。此外,ISO-8601 不允许在PnYnMnD
和PnW
格式之间混合。任何基于周的输入乘以 7 并视为天数。
示例:
格式 | 含义 |
---|---|
P2Y
|
两年 |
P3M
|
仨月 |
P4W
|
四周 |
P5D
|
五天 |
P1Y2M3D
|
一年俩月零3天 |
P1Y2M3W4D
|
一年俩月三周零四天,Period.of(1, 2, 25) ,3x7+4=25
|
P-1Y2M
|
Period.of(-1, 2, 0)
|
-P1Y2M
|
Period.of(-1, -2, 0)
|
❝
这个感觉用来做日历计算比较合适一些。
如果你觉得本篇有用,请点个再看和赞、转发哦!
完
往期推荐
避开10个面试大坑,接offer成功率提升至99%
知乎高赞:从源码层,拆解OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~
开源作者去世后,代码谁来继承?
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
8年了,这几个时间API你用过吗?相关推荐
- java8日期加本地,日期时间API(JDK8新增)
日期时间API(JDK8新增) JDK8出现之前 JDK8新时间日期API LocalDate.LocalTime.LocalDateTime 的使用 类似于Calendar LocalDateTim ...
- java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- java 时间api源码,时间API(示例代码)
1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还 ...
- jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...
- java8 日期api_我们多么想要新的Java日期/时间API?
java8 日期api 当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投 ...
- JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(例如我目前在我的当前项目中),有很好的反向移植,请访问www.threeten.org了解更 ...
- 我们多么想要新的Java日期/时间API?
当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投了赞成票,绝大多数人回答 ...
- 6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- java date加一天_Java日期时间API系列15-----Jdk8中API类,java日期计算2,年月日时分秒的加减等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 《Java8实战》笔记(12):新的日期和时间API
新的日期和时间API 相信大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想.值得高兴的是 Java 8中引入全新的日期和时间API就是要解决这一问题. Java 8之前的 ...
最新文章
- 函数stat、fstat、fstatat和lstat
- 排序算法笔记(Java)
- 流API--流的映射
- 深入PHP变量存储结构
- 转自weiphone]在美做开发多年,写给国内apple开发新手的一些心得,无教程
- 联想电脑Windows7系统重装方法,简单易上手
- Linux 之 常用端口
- 开发erp管理系统的好处
- tf15: 中文语音识别【转】
- 【cocos2dx】记录解决csb创建font字体造成的内存泄漏问题
- Android 使用Notification进行消息提示
- 1276. 不浪费原料的汉堡制作方案(Medium)
- Python入门笔记,代码练习——常用内置数据类型【持续更新】
- S3C2440 开发板实战(3):编译概念 + LED点亮闪烁
- python快速入门精讲_Python快速入门精讲
- 基于springboot的校园二手交易系统-JAVA【数据库设计、论文、源码、开题报告】
- 收集到一些关于python的文章,存起来慢慢看。。。
- 东辉创投放心用姓名存钱的利害,存款一切权归吗?
- [SCOI2009]粉刷匠 DP)
- 从0配置halo博客并配置SSL
热门文章
- 7.2图的存储结构(十字链表、邻接多重表、边集数组)
- C/C++基础面试-Const的全面理解(C部分)
- SQLite允许向一个integer型字段中插入字符串
- mysql 关闭数据库语句_sql数据库 关闭语句
- 中国电子协会考评中心_中国电子学会考评中心和CPA青少年编程能力等级测评有什么不同?...
- 装水体积c语言,C语言基础之--sizeof()运算符的使用以及注意
- 红黑树的删除_红黑树
- python网络爬虫_一篇文章教会你利用Python网络爬虫获取穷游攻略
- centos7 关闭防火墙的指令_CentOS7 怎么安装配置chrony时间同步服务?
- lr LoadRunner Internal Architecture loadrunner运行原理图解