Instant
最近我使用比较多,因为计算JWT的过期时间和发行时间都用的是它。有人会问为什么不使用呢?其实我也比较纳闷。经过一番查询才明白了为什么要使用。
时间是一条向前不断延伸的时间线。我们定义过期时间的时候肯定是一个瞬时时间点,而正好可以用来表示时间线上的一个时间戳,常用来记录事件时间戳。
时间戳示意图
的范围需要存储一个超过类型极限的数字,因此它被设计为两个部分:
从计算机元年(1970-01-01T00:00:00Z)开始的秒数,可能是负数哦。
纳秒数,用来修正时间以保证准确性,始终是正数,而且小于。
常用API的使用
如果你使用获取当前时间戳,采用的是UTC时间,并非北京时间。所以需要加上时区:
的实现类,比如常用的、都可以转换为,例如:
如果在计算机元年以前,需要用负值表示:
还有其它一些API就不一一介绍了,请务必记住,它通常用来记录事件发生的瞬时时刻。
Duration
这是一个持续时间,通常表示持续了多少时间。它记录了一个时间量,可以来自一个开始时间和结束时间,也可以来自一些时间计量单位。它同样用秒数和纳秒来存储时间量,秒数同样可以是负数,纳秒只能是正数。
Java 8 Duration
常用API的使用
比如你花了3天时间写了个需求:
再精确点,从2022年4月2日到2022年4月5日,共3天:
注意这里只能使用能够表示到秒的实现,比如只能表示到天,是不行的。
剩下的持续了多少年、多少月、多少分钟、多少小时、多少秒就不一一演示了。
格式化
格式基于ISO-8601持续时间格式 ,其中天数被认为是 24 小时。字符串以可选符号开头,由 ASCII 负号或正号表示。如果为负,则整个周期都被否定。接下来是大写或小写的ASCII字母“P”。然后有四个部分,每个部分由一个数字和一个后缀组成。这些部分具有“D”、“H”、“M”和“S”的 ASCII 后缀,表示天、小时、分钟和秒,接受大写或小写。后缀必须按顺序出现。ASCII 字母“T”必须出现在小时、分钟或秒部分的第一次出现(如果有)之前。必须存在四个部分中的至少一个,如果存在“T”,则必须在“T”之后至少有一个部分。每个部分的数字部分必须由一个或多个 ASCII 数字组成。该数字可以以 ASCII 负号或正号为前缀。天数、小时数和分钟数必须解析为long 。秒数必须解析为带有可选分数的long整数。小数点可以是点或逗号。小数部分可能有 0 到 9 个数字。
实力
Period
说到这里就不得不说一下,感觉它和非常类似,只不过它建立在年月日上,以年、月和日为单位对时间量或时间量进行建模。非常容易理解这里就不细说了,记住它最多精确到天就够了,它同样是用来记录持续时间的,只不过粒度粗了一些。
常用API
持续了2年:
这里可以使用周进行初始化:
新冠从2019年12月持续到2022年4月
格式化
基于 ISO-8601 句点格式和 。字符串以可选符号开头,由 ASCII 负号或正号表示。如果为负,则整个周期都被否定。接下来是大写或小写的 ASCII 字母“P”。然后有四个部分,每个部分由一个数字和一个后缀组成。必须存在四个部分中的至少一个。这些部分具有“Y”、“M”、“W”和“D”的 ASCII 后缀,表示年、月、周和日,接受大写或小写。后缀必须按顺序出现。每个部分的数字部分必须由 ASCII 数字组成。该数字可以以 ASCII 负号或正号为前缀。该数字必须解析为 。前导加号/减号和其他单位的负值不是 ISO-8601 标准的一部分。此外,ISO-8601 不允许在和格式之间混合。任何基于周的输入乘以 7 并视为天数。
示例:
这个感觉用来做日历计算比较合适一些。
如果你觉得本篇有用,请点个再看和赞、转发哦!
关键词: ascii