前言
在日常开发中,咱们常常会应用到一些无关日期相干的数据操作,比方:获取日期对应周几、获取一个月中存在等获取工夫的操作。
而在 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
的应用,能够对于常见的业务场景的工夫日期进行高效的计算,更多还是本人去入手去实际吧。