满怀忧思之余,让我们先行动起来,学习如何重新定义自己!时间在生活的重要性不言而喻,java为我们提供了时间的api。过去,java8之前的日期和时间总是让程序员们头疼。但在java8中,全新的日期和时间api被引入,现在我们的项目中都在使用这一新的api。接下来,让我们一起来探讨这些改变,以及它们为何如此重要。
我们先来回顾一下旧api的弊端,然后再逐一介绍新api的升级和应用。相信你会被这些改变所吸引。对于日期和时间的操作,这里都包含了!
java老api的缺点主要表现在以下几点:
1. 日期和时间的计算方式不合理;
2. 日期和时间的输出格式不合理;
3. 时间格式化工具:dateformat是线程不安全的;
4. 类库包设计杂乱。
在java1.0中,对日期和时间的支持只能依赖java.util.date类。这个类无法表示日期,只能以毫秒的精度表示时间。设计上存在诸多不合理,比如年份的起始选择是1900年,月份的起始从0开始。比如要表示女朋友的生日,即2022年12月10日,需要通过以下方式:
这样的表示方法看起来非常别扭。它的返回值中包括jvm的默认时区,容易让人混淆。
而在新的api中,我们有了更加清晰和合理的设计。比如java.time包中的各类日期和时间类,如localdate、localtime、localdatetime等,它们都是不可变对象,只表示日期或时间信息,不包含时区信息。这些类的设计使得代码更加易读和易维护。
instant类是java8中新增的时间戳类,它比system.currenttimemillis()更加精确,可以以纳秒为单位表示时间。这个类基于计算机角度描述时间,以unix元年时间(1970年1月1日0点)为起点计算所经历的秒数。虽然它的设计初衷是为了便于机器使用,但我们也可以利用它进行各种时间计算。
period和duration则是用来计算日期和时间间隔的类。period对应的是localdate,用于计算两个日期之间的间隔,并以年、月、日的形式表示。而duration则对应的是instant、localtime、localdatetime,用于计算两个时间之间的间隔,可以具体到天、时、分、秒、毫秒、纳秒。
关于duration及相关类详解
duration简介
duration主要用于表示一个时间段,这个时间段包含秒和纳秒的计算,但不包括毫秒。它通过组合来表达时间长度,适用于处理时间差异而非绝对时间点。duration并不存在如“now()”这样的静态方法。
处理时间相关类
duration主要操作的时间相关类有localtime、localdatetime和zoneddatetime。若传入描述日期的localdate类,将会抛出异常。
其默认输出格式为ptnhnmns,例如pt8h6m12.345s,表示时间间隔。当duration为0时,默认为pt0s。
常用api及方法
简单api调用可用于计算period(日期差)与duration(时间差)之间的区别。
计算时间间隔的方法包括:
1. 通过duration直接计算两个localtime相差的时间。
2. 使用chronounit类的between()方法来执行相同操作。
3. 利用localtime类的tosecondofday()方法,返回时间对应的秒数,进而计算出两个时间相差的间隔。
还有关于计算两个时间戳间隔的总结等内容。
日期操作、格式化及解析
在处理日期时,localdate是不可变的,计算后都会返回一个新的localdate对象。java 8的java.time包中提供了datetimeformatter和datetimeformatterbuilder来进行日期、时间的格式化。
datetimeformatter具有可直接用于解析字符序列的内置格式。而datetimeformatterbuilder则提供自定义方式来创建格式化器,并拥有强大的解析功能,如区分大小写的解析、柔性解析以及填充等功能。
关于时区处理,新的api极大地简化了操作。使用zoneid类可以轻松处理时区,而无需担心时区处理的复杂和繁琐。每个zoneid对象都由一个地区id标识,这些地区id遵循一定的规则划分,并由iana时区数据库提供。
一旦得到zoneid对象,就可以与localdate、localdatetime或者是instant对象整合起来,构造为一个zoneddatetime实例,它代表了相对于指定时区的时间点。
总结
java 8的新日期和时间api在许多方面都进行了优化和改进。这些改进包括但不限于不可变的日期时间对象、两种不同的时间表示方式、精细的日期操作、线程安全的格式化以及自定义的格式化风格等。这些改进使得处理日期和时间变得更加简单和灵活。
结尾