0
点赞
收藏
分享

微信扫一扫

【语言】Java 日期 API 的使用技巧

​​​​



前言

在日常开发中,我们经常会使用到一些有关日期相关的数据操作,比如:获取日期对应周几、获取一个月中存在等获取时间的操作。

而在 Java 8 之前的日期 API 设计是非常反人类的。使用 ​​new Date()​​ 创建的时间,获取年份的时候,是通过从1900开始1计算,而且获取的月份0代表1月份。并且使用时无法保证线程安全,多个线程操作时,可能会出问题。

到了 Java 8 将时间的 API 进行重新的设计,明确分离,它为日期(​​Date​​​)、时间(​​Time​​​)、日期时间(​​DateTime​​​)、时间戳(​​unix timestamp​​)以及时区定义了不同的类,而且所有类是不可变的,保证了使用中线程安全问题。

本文将对开发中常用的案例,进行讲解,方便大家高效开发。

核心类

Java 8 日期时间的默认格式如下:​​yyyy-MM-dd-HH-mm-ss.zzz​

几个主要的核心类:


  • ​LocalDate​​:表示日期类,不包含时间时分秒
  • ​LocalTime​​:表示时间类,不包含日期月日年
  • ​LocalDateTime​​:表示日期和时间类
  • ​ZonedDateTime​​:表示时区日期时间类
  • ​OffsetDateTime​​:表示按 UTC 时间偏移来得到日期时间
  • ​Clock​​:表示获取某个时区下当前的瞬时时间,日期或者时间
  • ​Instant​​​:表示Unix时间,代表时间戳,比如​​2018-01-14T02:20:13.592Z​
  • ​Duration​​:表示两个时间之间,表示一个绝对的精确跨度,使用毫秒为单位
  • ​Period​​:表示两个日期之间
  • ​ZoneId​​:表示时区
  • ​DateTimeFormatter​​:表示格式化输出
  • ​TemporalAdjusters​​:表示获得指定日期时间等,如当月的第一天、今年的最后一天等等

常用案例

获取今日的日期

使用 ​​LocalDate​​​ 对象的 ​​now()​​​ 可以直接拿到今日的日期。然后通过 ​​DateTimeFormatter​​ 可以对日期进行格式化打印。

LocalDate localDate = LocalDate.now();
System.out.println("今天日期是:"+localDate);
DateTimeFormatter fmtDate = DateTimeFormatter.ofPattern("yyyyMMdd");
System.out.println("今天日期格式化:"+localDate.format(fmtDate));

/**
* -------- 打印 --------
* 今天日期是:2021-11-12
* 今天日期格式化:20211112
*/

获取日期中的年月日

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int day = localDate.getDayOfMonth();
System.out.println("年:"+year);
System.out.println("月:"+month);
System.out.println("日:"+day);

/**
* -------- 打印 --------
*年:2021
*月:11
*日:12
*/

比较不同日期

​LocalDate​​​ 对象可以通过 ​​equals()​​​ / ​​isAfter()​​​ / ​​isBefore()​​ 方法对日期进行比较,非常方便。

LocalDate localDate = LocalDate.now();
LocalDate localDateOther = LocalDate.of(2021,11,11);
System.out.println("localDate 等于 localDateOther:"+localDate.equals(localDateOther));
System.out.println("localDate 大于 localDateOther:"+localDate.isAfter(localDateOther));
System.out.println("localDate 小于 localDateOther:"+localDate.isBefore(localDateOther));

/**
* -------- 打印 --------
*localDate 等于 localDateOther:false
*localDate 大于 localDateOther:true
*localDate 小于 localDateOther:false
*/

获取当前时间

使用 ​​LocalTime​​​ 对象的 ​​now()​​ 可以直接拿到今日的时间,不包含日期。

LocalTime nowTime = LocalTime.now();
System.out.println("当前时间为:"+nowTime);

/**
* -------- 打印 --------
*当前时间为:12:56:17.908
*/

日期时间的计算

使用 ​​LocalTime​​​ 对象的 ​​now()​​ 可以直接拿到今日的时间,不包含日期。

LocalDate localDate = LocalDate.of(2021,11,11);
LocalTime nowTime = LocalTime.now();
LocalDate tempDate;
LocalTime tempTime;

tempDate = localDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusDays(7);
System.out.println("今年双11上周周一是:"+tempDate);

DayOfWeek dayOfWeek = localDate.getDayOfWeek();
System.out.println("今年双11是周几?:"+dayOfWeek);

tempTime = nowTime.plusHours(5).plusMinutes(20);
System.out.println("五小时20分钟后是:"+tempTime);

tempTime = nowTime.minusHours(3);
System.out.println("3小时前是:"+tempTime);

/**
* -------- 打印 --------
*今年双11上周周一是:2021-11-01
*今年双11是周几?:THURSDAY
*五小时20分钟后是:18:28:44.508
*3小时前是:10:08:44.508
*/

计算两个日期之间的间隔

使用 ​​LocalTime​​​ 对象的 ​​now()​​ 可以直接拿到今日的时间,不包含日期。

LocalDate localDate = LocalDate.of(2019,5,1);
LocalDate localDateOther = LocalDate.of(2021,11,11);
Period period = Period.between(localDate, localDateOther);
System.out.println("Years:" + period.getYears() +" months:" + period.getMonths() +" days:"+period.getDays());

/**
* -------- 打印 --------
*Years:2 months:6 days:10
*/

总结

通过 ​​LocalDate​​​、​​LocalTime​​ 的使用,可以对于常见的业务场景的时间日期进行高效的计算,更多还是自己去动手去实践吧。

举报

相关推荐

0 条评论