十九、章节练习(2)
举例一种方式:
二十、TemporalAdjuster调节器的使用
调节器TemporalAdjuster与查询TemporalQuery
with(TemporalAdjuster adjuster)
在上一节学习的with方法中学习了可以通过with方法修改日期时间对象中封装的数据,但是有一些时候可能会做一些复杂的操作,比如说将时间调整到下个周的周日,下一个工作日,或者本月中的某一天,这个时候可以使用调节器TemporalAdjuster来更方便的处理日期。
with方法有一个重载形式,需要传入一个TemporalAdjuster对象,通过查看发现TemporalAdjuster是一个接口,那么实际上传入的是这个接口的实现类对象。
在以上的描述中,发现了一个叫做TemporalAdjusters的类可以给我们提供一些常用的方法,方法如下:
TemporalAdjusters类中常用静态方法的使用
static TemporalAdjuster firstDayofNextMonth() 下个月的第一天
static TemporalAdjuster firstDayOfNextYear() 下一年的第一天
static TemporalAdjuster firstDayOfYear() 当年的第一天
注意:TemporalAdjusters 是一个接口,with方法实际上传入的是这个饥饿口的实现类对象,TemporalAdjusters并不是TemporalAdjuster的实现类,只不过TemporalAdjusters的静态方法实现了TemporalAdjuster,并且将实现类对象返回了。
二十一、DayOfWeek枚举类使用
DayOfWeek是一周中星期几的枚举类,其中封装了从周一到周日
二十二、自定义TemporalAdjuster调节器
通过Java8本身提供的TemporalAdjusters中的方法可以完成一些常用的操作,如果要自定义日期时间的更改逻辑,可以通过实现TemporalAdjuster类接口的方式来完成。
1、创建类实现TemporalAdjuster接口
2、实现TemporalAdjuster中的 adjusterInto()方法,传入一个日期时间对象,完成逻辑之后返回日期事件对象。
3、通过with方法传入自定义调节器对象完成更改。
例如:假如员工一个月中领取工资,发薪日是每个月的15日,如果发薪日是周末,则调整为周五。
二十三、TemporalQuery的应用
学习的时态类对象(LocalDate,LocalTime)都有一个方法叫做query,可以针对日期进行查询,R query(TemporalQuery query)这个方法是一个泛型方法,返回的数据就是传入的泛型类的类型,TemporalQuery是一个泛型接口,里面有一个抽象方法是R queryFrom(TemporalAccessor temporal),TemporalAccessor是Temporal的父接口,实际上也就是LocalDate,LocalDateTime相关类的顶级父接口,这个queryFrom的方法的实现逻辑就是,传入一个日期/时间对象通过自定义逻辑返回数据。
如果要计划日期距离某一天特定天数差距多少天,可以自定义类实现TemporalQuery接口并且作为参数传到query方法中。
例如:计算当前时间距离下一个劳动节还有多少天?
二十四、章节练习(3)
二十五、java.util.Date转换为java.time.LocalDate(1)
对于老项目的改造,需要将Date或者Calendar转换为java.util包中相应的类的,可以根据本小节中提供的方法进行改造。
Java8中的java.time中并没有提供太多的内置方式来转换java.util包中用预处理标准日期和时间的类,我们可以使用Instant类作为中介,也可以使用java.sql.Date和java.sql.TimeStamp类提供的方法进行转换。
使用Instant类将java.util.Date转换为java.time.LocalDate
java.time包中并没有提供很多的方式来进行直接转换,但是给之前的Date类,Calendar类在java1.8都提供了一个新的方法,叫做toInstant(),可以将当前对象转换为Instant对象,通过给Instan添加时区信息之后就可以转换为LocalDate对象。
二十六、java.sql.Date与java.sql.Timestamp的转换方式
java.sql.Date类中提供直接转换为LocalDate的方法,toLocalDate()
java.sql.Timestamp类是时间戳对象,通过传入一个毫秒值对象进行初始化
二十七、java.util.Date转换为java.time.LocalDate方式(2)
将java.util.Date类转换为java.time.LocalDate类的第二种方法
java.sql.Date类提供了转换为LocalDate的方法,那么可以将java.util.Date先转换为java.sql.Date。
通过java.sql.Date的构造方法直接传入一个毫秒值可以构造一个java.sql.Date对象,毫秒值可以通过java.util.Date对象的getTime()方法获取到。
二十八、Calendar转换为ZonedDateTime
Calendar对象字Java1.1开始提供了一个方法获取时区对象的方法,getTimeZone(),要将Calendar对象转换为ZonedDateTime需要先获取到时区对象。从Java1.8开始TimeZone类提供了一个方法可以获取到ZonedId。获取到ZonedId之后就可以初始化ZOnedDateTime对象了,ZonedDateTime类有一个ofInstant()方法,可以将一个Instant对象和ZonedId对象作为参数传入构造一个ZonedDateTime对象。
二十九、Calendar转换为LocalDateTime
java.util.Calendar类转换为java.time.LocalDateTime类
Calendar对象可以获取到年月日时分秒的信息,这些信息可以作为LocalDateTime构造方法的参数
三十、新日期实践类的parse和format方法
SimpleDateFormat类在刚开始的时候讲过了是线程不安全的,所以Java8提供了新的格式化类 DateTimeFormatter
dateTimeFormatter类提供了大量预定义格式化器,包括常量(如ISO_LOCAL_DATE),模式字母(如yyyy-MM-dd)以及本地化样式。
与SimpleDateFormat不同的是,新版本的日期/时间API的格式化与解析不需要再创建转换器对象了,通过时间日期对象的parse/format方法可以直接进行转换.
LocalDate类定义的parse和format方法
三十一、ofLocalizedDate方法
对日期进行格式化
通过DateTimeFormatter的ofLocalizedDate的方法也可以调整格式化的方式。
public static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle) {
Objects.requireNonNull(dataStyle, message:"dateStyle"); return new DateTimeFormatterBuilder().appendLocalized(dateStyle,timeStyle:"null") .toFormatter(ResolverStyle.Smart, IsoChronology.Instance);
}
此方法需要传入一个FormatStyle类对象,擦好看后发现FormaStyle对象是一个枚举类,其中有几种方式如下:
Full:全显示(年月日+星期) Long:全显示(年月日) Medium:缩略显示(没有年月日汉字) SHORT:精简显示(精简年+月日)
三十二、自定义格式化器
除了系统自带的方式之外,也可以通过DateTimeFormatter类提供的ofPattern方式创建自定时格式化器,格式化的写法与之前使用SimpleDateFormat相同。