相信大家对Java8中的LocalDate和LocalDateTime都非常熟悉了,这些时间API非常语义化,可以保证线程安全。今天给大家介绍几个其他大家可能不常用的时间API及其使用场景,希望能帮助大家更好的开发。Instant我最近用的比较多的是java.time.Instant,因为它是用来计算JWT的过期时间和发行时间的。可能有人会问为什么不用LocalDateTime呢?其实我也很疑惑。经过一番询问,我明白了为什么要使用Instant。时间是一条不断延伸的时间线。我们在定义过期时间的时候,必须是一个瞬时的时间点,而Instant在时间轴上只能用来表示一个时间戳,常用来记录事件的时间戳。TimestampDiagramInstant的范围需要存储一个超过long类型限制的数字,所以设计成两部分:seconds从计算机第一年开始的秒数(1970-01-01T00:00:00Z),这可能是负面的。.nanos纳秒数,用于校正时间以确保准确性,始终为正数,且小于999,999,999。常用API的使用如果使用Instant.now()获取当前时间戳,则使用UTC时间,而不是北京时间。所以你需要添加时区:issuedAt=Clock.system(ZoneId.of("Asia/Shanghai")).instant();TemporalAccessor的实现类,比如常用的LocalDate和LocalDateTime,可以转为Instant,例如:Instantcurrent=Instant.from(LocalDateTime.now());Instantinstant=LocalDateTime.now().toInstant(ZoneOffset.ofHours(8));如果是计算机元年之前,需要用负值表示:instantinstantBefore1970=Instant.ofEpochSecond(-13434234,343434);还有其他的API就不一一介绍了。请记住,它通常用于记录事件的瞬间。Duration这是一个持续时间,通常表示持续多长时间。它记录了一个时间量,它可以来自开始时间和结束时间,或者一些时间度量单位。它还使用秒和纳秒来存储时间量。秒也可以是负数,纳秒只能是正数。Java8Duration常用API的使用比如你花了3天写了一个需求:Durationdays=Duration.ofDays(3);更准确地说,从2022年4月2日到2022年4月5日,一共3天:Durationduration=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。秒数必须解析为带有可选分数的长整数。小数点可以是点或逗号。小数部分可以有0到9位。强度:格式含义PT20.345S20.345秒PT15M15分钟PT10H10小时P2D2天P2DT3H4M2天3小时4分钟P-6H3M减6小时加3分钟,等于负5小时57分钟-P6H3M否定所有,减6小时3分钟-P-6H+3M加6小时减3分钟,等于最后5小时57分钟Period说到这里,就不得不说说Period了。感觉和Duration很像,只不过它是建立在年月日之上,建模时间量或者以年月日为单位的时间量。这很容易理解。这里我就不细说了。记住它最多精确到一天就足够了。也用于记录时长,但粒度较粗。常用API持续2年:Periodyears=Period.ofYears(2);//其他时间单位不再演示。这里可以使用weeks进行初始化:Periodweeks=Period.ofWeeks(3);新冠持续时间为2019年12月至2022年4月期间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一年两个月零三天P1Y2M3W4D一年两个月三周零四天,Period.of(1,2,25),3x7+4=25P-1Y2MPeriod.of(-1,2,0)-P1Y2MPeriod.of(-1,-2,0)这个感觉比较适合日历计算。
