java.time笔记(19-33)

                                  十九、章节练习(2)

举例一种方式:

Java8TimeMethodTest.java

                       二十、TemporalAdjuster调节器的使用

调节器TemporalAdjuster与查询TemporalQuery

with(TemporalAdjuster adjuster)

在上一节学习的with方法中学习了可以通过with方法修改日期时间对象中封装的数据,但是有一些时候可能会做一些复杂的操作,比如说将时间调整到下个周的周日,下一个工作日,或者本月中的某一天,这个时候可以使用调节器TemporalAdjuster来更方便的处理日期。

with方法有一个重载形式,需要传入一个TemporalAdjuster对象,通过查看发现TemporalAdjuster是一个接口,那么实际上传入的是这个接口的实现类对象。



TemporalAdjuster函数式接口

在以上的描述中,发现了一个叫做TemporalAdjusters的类可以给我们提供一些常用的方法,方法如下:

TemporalAdjusters类中常用静态方法的使用

static TemporalAdjuster firstDayofNextMonth()   下个月的第一天

static TemporalAdjuster firstDayOfNextYear()   下一年的第一天

static TemporalAdjuster firstDayOfYear()    当年的第一天


Java8TimeTemporalAdjusterDemo1.java

注意:TemporalAdjusters 是一个接口,with方法实际上传入的是这个饥饿口的实现类对象,TemporalAdjusters并不是TemporalAdjuster的实现类,只不过TemporalAdjusters的静态方法实现了TemporalAdjuster,并且将实现类对象返回了。

                          二十一、DayOfWeek枚举类使用

DayOfWeek是一周中星期几的枚举类,其中封装了从周一到周日


Java8TimeTemporalAdjusterDemo2.java

                   二十二、自定义TemporalAdjuster调节器

通过Java8本身提供的TemporalAdjusters中的方法可以完成一些常用的操作,如果要自定义日期时间的更改逻辑,可以通过实现TemporalAdjuster类接口的方式来完成。

1、创建类实现TemporalAdjuster接口

2、实现TemporalAdjuster中的 adjusterInto()方法,传入一个日期时间对象,完成逻辑之后返回日期事件对象。

3、通过with方法传入自定义调节器对象完成更改。

例如:假如员工一个月中领取工资,发薪日是每个月的15日,如果发薪日是周末,则调整为周五。


PayDayAdjuster.java


Java8TimeTemporalAdjusterDemo3.java

                       二十三、TemporalQuery的应用

学习的时态类对象(LocalDate,LocalTime)都有一个方法叫做query,可以针对日期进行查询,R    query(TemporalQuery query)这个方法是一个泛型方法,返回的数据就是传入的泛型类的类型,TemporalQuery是一个泛型接口,里面有一个抽象方法是R    queryFrom(TemporalAccessor temporal)TemporalAccessor是Temporal的父接口,实际上也就是LocalDate,LocalDateTime相关类的顶级父接口,这个queryFrom的方法的实现逻辑就是,传入一个日期/时间对象通过自定义逻辑返回数据。

如果要计划日期距离某一天特定天数差距多少天,可以自定义类实现TemporalQuery接口并且作为参数传到query方法中。

例如:计算当前时间距离下一个劳动节还有多少天?


UtilDayQueryImpl.java


Java8TimeTemporalQueryDemo1.java

                                二十四、章节练习(3)


TestQueryImpl.java


Java8TimeTemporalQueryTest2.java

            二十五、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对象。


Java8DateToLocalDateDemo1.java

       二十六、java.sql.Date与java.sql.Timestamp的转换方式

java.sql.Date类中提供直接转换为LocalDate的方法,toLocalDate()

java.sql.Timestamp类是时间戳对象,通过传入一个毫秒值对象进行初始化


Java8DateToLocalDemo2.java

      二十七、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()方法获取到。


Java8DateToLocalDateDemo4.java

                 二十八、Calendar转换为ZonedDateTime

Calendar对象字Java1.1开始提供了一个方法获取时区对象的方法,getTimeZone(),要将Calendar对象转换为ZonedDateTime需要先获取到时区对象。从Java1.8开始TimeZone类提供了一个方法可以获取到ZonedId。获取到ZonedId之后就可以初始化ZOnedDateTime对象了,ZonedDateTime类有一个ofInstant()方法,可以将一个Instant对象和ZonedId对象作为参数传入构造一个ZonedDateTime对象。


Java8TimeCalendarToZoneedDateTimeDemo1.java

                 二十九、Calendar转换为LocalDateTime

java.util.Calendar类转换为java.time.LocalDateTime类

Calendar对象可以获取到年月日时分秒的信息,这些信息可以作为LocalDateTime构造方法的参数


Java8TimeCalendarToLocalDateTimeDemo1.java

                三十、新日期实践类的parse和format方法

SimpleDateFormat类在刚开始的时候讲过了是线程不安全的,所以Java8提供了新的格式化类 DateTimeFormatter

dateTimeFormatter类提供了大量预定义格式化器,包括常量(如ISO_LOCAL_DATE),模式字母(如yyyy-MM-dd)以及本地化样式。

与SimpleDateFormat不同的是,新版本的日期/时间API的格式化与解析不需要再创建转换器对象了,通过时间日期对象的parse/format方法可以直接进行转换.

LocalDate类定义的parse和format方法


java8TimeFormatAndParseDemo1.java

                            三十一、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:精简显示(精简年+月日)

Java8TimeFormatAndParseDemo2.java

                                三十二、自定义格式化器

除了系统自带的方式之外,也可以通过DateTimeFormatter类提供的ofPattern方式创建自定时格式化器,格式化的写法与之前使用SimpleDateFormat相同。



Java8TimeFormatAndParseDemo3.java

                                三十三、章节练习(4)


Java8TimeFormatAndParseTest1.java

                                                  结    束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。