作者:幻好
来源:恒生LIGHT云社区
前言
在日常开发中,我们经常会使用到一些有关日期相关的数据操作,比如:获取日期对应周几、获取一个月中存在等获取时间的操作。
而在 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
的使用,可以对于常见的业务场景的时间日期进行高效的计算,更多还是自己去动手去实践吧。
评论