0
点赞
收藏
分享

微信扫一扫

【函数式编程实战】(十) 优雅的处理代码中的时间类


前言
📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫 
🏆 Java领域优质创作者、阿里云专家博主、华为云专家🏆

目录

​​本文导读​​

​​一、新的时间API(LocalDate、LocalTime、LocalDateTime)​​

​​二、新的时间API(Duration、Period)​​

​​三、解析与格式化日期API(TemporalAdjuster)​​

​​四、处理时区的API(ZoneId)​​

​​总结​​

本文导读

java8之前的的Date类、Calender类等在逐渐淘汰或者已经死亡,新的时间与日期类LocalDate、LocalTime、LocalDateTime……正在悄悄流行

一、新的时间API(LocalDate、LocalTime、LocalDateTime)

Java在逐渐淘汰Date类、Calender类因为首先可变的*(不安全),DateFormat有线程安全问题

LocalDate是一个不可变对象,它只提供简单的日志,并且不含当天的时间,也不附带任何与时区的信息,可以通过静态工厂方法 of 创建。

public static void main(String[] args) {
// LocalDate 常用api
LocalDate date = LocalDate.of(2022, 2, 24);
LocalDate.now();
date.getYear();
date.getMonth();
date.getDayOfMonth();
date.lengthOfMonth();
date.isLeapYear();

// LocalTime 常用api
LocalTime time = LocalTime.of(14, 2, 24);
LocalTime.now();
LocalTime.parse("14:14:14");
time.getHour();
time.getMinute();
time.getSecond();

// LocalDateTime 常用api ,合并日期和时间
LocalDateTime dateTime = LocalDateTime.of(2022, 2, 24, 14, 2, 24);
LocalDateTime dateTime1 = LocalDateTime.of(date, time);
dateTime.toLocalDate();
dateTime.toLocalTime();
}

二、新的时间API(Duration、Period)

LocalDate、LocalTime、LocalDateTime都是继承自Temporal接口,Temporal接口定义了如何读取和操作时间的对象。Duration、Period 可以对这些对象进行操作,例如比较、检查等等

【函数式编程实战】(十) 优雅的处理代码中的时间类_java

public static void main(String[] args) {
// Duration 创建两个时间之间的 时间间隔
Duration duration = Duration.between(LocalTime.of(14, 2, 24)
, LocalTime.of(15, 2, 24));
System.out.println(duration);

// Period 创建两个时间之间的 日期间隔
Period period = Period.between(LocalDate.of(2022, 2, 24)
, LocalDate.of(2022, 2, 24));
System.out.println(period);
}

三、解析与格式化日期API(TemporalAdjuster)

LocalDate对象提供了大量帮助你操作的API,但是可以看到, LocalDate、LocalDateTime等等时间工具类局限性还是比较大,操作过于直接,Java提供了 TemporalAdjuster 对象 ,这里面是一些通用的方法,在实际操作过程中可以使用通用方法避免硬编码,提高可读性

public void localDateImpl() {
LocalDate date = LocalDate.of(2022, 2, 24);

// 修改时间, 需要用另一个对象接收
LocalDate date1 = date.with(ChronoField.MICRO_OF_DAY, 3);
LocalDate date2 = date.withYear(2023);
LocalDate date3 = date.withDayOfMonth(25);
LocalDate date4 = date.plusWeeks(1);
LocalDate date5 = date.minusDays(7);
LocalDate date6 = date.plus(2, ChronoUnit.MONTHS);
}

dayOfWeekInMonth

创建一个值为同一个月中每一周的第几天(负数表示从月末往月初计数)

firstDayOf*

firstDayOfNonth创建当月的第一天;firstDayOfNextMonth 创建下月的第一天;firstDayOfNextYear 创建明年的第一天;firstDayOfYear 创建当年的第一天
firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值

lastDayOf*

lastDayOfMonth 创建当月的最后一天;lastDayOfNextMonth 创建下月的最后一天;lastDayOfNextYear 创建明年的最后一天;lastDayOfYear 创建当年的最后一天;lastInMonth 创建同一个月中,最后一个符合星期几要求的值

next* / previous*

next/previous 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
期几要求的日期;nextOrSame/previousOrSame 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,则直接返回该对象

public void localDateImpl() {
LocalDate date = LocalDate.of(2022, 2, 24);

// 修改时间, 需要用另一个对象接收
// 创建一个日期是设定日期的,第一个符合设置星期的时间
date.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
// 创建一个日期是当月的最后一天
date.with(TemporalAdjusters.lastDayOfMonth());
}

四、处理时区的API(ZoneId)

到此看到的日期和时间的种类都不包含时区信息。新版java. time . ZoneId类是老版java.util. TimeZone类的替代品。跟Java8 新增的其他日期和时间API类一样,ZoneId 类也是无法修改的。

【函数式编程实战】(十) 优雅的处理代码中的时间类_lambda_02

时区是按照区域划分的,我们在使用ZoneId时,要明确地区ID,可以通过 toZoneId()方法获取ZoneId对象,ZoneId对象可以和LocalDate对象连用

public void zoneId() {
ZoneId zoneId = TimeZone.getDefault().toZoneId();
// Asia/Shanghai
System.out.println(zoneId);

LocalDate date = LocalDate.now();
// 2022-02-24T00:00+08:00[Asia/Shanghai]
System.out.println(date.atStartOfDay(zoneId));
}

总结

本讲讲解Java以前的Date类、Calender类的缺陷,说明为什么要使用新型的时间类(LocalDate、LocalTime、LocalDateTime、Duration、Period、TemporalAdjuster)并进行实战演示

举报

相关推荐

0 条评论