Hi,我们好,我是抢老婆酸奶的小肥仔。

jdk1.8后引入了新的日期时刻处理API,相比传统的date操作愈加简洁,date中的SimpleDateFormat也是非线程安全的。

新的API是标准的ISO-8601日历体系,坐落java.time包下,且一切类都是不可变类型、线程安全。

废话不多说,开干。

1、获取当时日期时刻

now() :静态办法,依据当时时刻创立目标。例如:获取当时日期,当时时刻,当时日期时刻

//获取当时日期
LocalDate nowDate = LocalDate.now();
System.out.println("获取当时日期:"+nowDate);
//获取当时时刻
LocalTime nowTime = LocalTime.now();
System.out.println("获取当时时刻:"+nowTime);
//获取当时日期时刻
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("获取当时日期时刻:"+nowDateTime);

输出:

获取当时日期:2023-05-11

获取当时时刻:11:10:10.453

获取当时日期时刻:2023-05-11T11:10:10.454

2、日期时刻格局化

DateTimeFormatter:静态格局化类,供给了ofPattern,ofLocalizedDate,format等格局化办法。

办法 描述
ofPattern(String pattern) 格局化款式定义,例如:yyyy-MM-dd等
format(TemporalAccessor temporal) 执行格局化,回来字符串类型的时刻款式,如:2023-05-11
ofLocalizedDate(FormatStyle dateStyle) 回来特定区域的日期格局。FormatStyle供给了四种类型,别离是:FULL、LONG,SHORT、MEDIUM
ofLocalizedTime(FormatStyle dateStyle) 回来特定区域的时刻格局。
ofLocalizedDateTime(FormatStyle dateStyle) 回来特定区域的日期时刻格局

注:在运用ofLocalizedTimeofLocalizedDateTime中的FormatStyle.FULLFormatStyle.LONG时因为时区信息问题,一般不存储在LocalTime,LocalDateTime目标中,因此会报取不到值的过错。如:

【java】真香,java8日期应用,你不可或缺小帮手

private static final DateTimeFormatter TIME_DTF = DateTimeFormatter.ofPattern("hh:mm:ss");
private static final DateTimeFormatter DATE_DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter DATE_TIME_DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格局化
System.out.println("日期格局化:" + DATE_DTF.format(nowDate));
System.out.println("时刻格局化:" + TIME_DTF.format(nowTime));
System.out.println("日期时刻格局化:" + DATE_TIME_DTF.format(nowDateTime));
System.out.println("日期款式:" + DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(nowDate));
System.out.println("日期款式:" + DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(nowDate));
System.out.println("日期款式:" + DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(nowDate));
System.out.println("日期款式:" + DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(nowDate));
//System.out.println("时刻款式:" + DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).format(LocalTime.now()));
System.out.println("时刻款式:" + nowTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM)));
// System.out.println("时刻款式:" + nowTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG)));
System.out.println("时刻款式:" + nowTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)));
System.out.println("日期时刻款式:" + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(nowDateTime));

输出:

日期格局化:2023-05-11

时刻格局化:11:43:48

日期时刻格局化:2023-05-11 11:43:48

日期款式:2023年5月11日 周四

日期款式:2023-5-11

日期款式:23-5-11

日期款式:2023年5月11日

时刻款式:11:43:48

时刻款式:上午11:43

日期时刻款式:2023-5-11 11:43:48

3、获取日期的年月日

在Date中获取月份是从0开始的,因此真实的月份是需求加1的。而LocalDate供给的办法则不需求。

getYear() :获取年份,回来int,

getMonthValue() :获取月份值,相当所以getMonth().getValue()。

getMonth() :获取的是月份枚举类型,存储的是英文的月份,能够经过getValue()获取int的月份

getDayOfMonth() :获取月份中第几天,

getDayOfYear() :获取当时日期在一年中的第几天。

getDayOfWeek() :获取星期,回来DayOfWeek枚举,保存英文星期,经过getValue()获取数字星期几。

//获取年月日
int year = nowDate.getYear();
int monthValue = nowDate.getMonthValue();
int month = nowDate.getMonth().getValue();
int day = nowDate.getDayOfMonth();
int dayOfYear = nowDate.getDayOfYear();
int dayOfWeek = nowDate.getDayOfWeek().getValue();
System.out.println("year:" + year + ",monthValue:" + monthValue +
        ",month:" + month + ",day:" + day +
        ",dayOfYear:" + dayOfYear + ",dayOfWeek:" + dayOfWeek );

输出:

year:2023,monthValue:5,month:5,day:11,dayOfYear:131,dayOfWeek:4

4、时刻转化

时刻转化,包含Date转LocalDate、LocalTime、LocalDateTime;LocalDateTime转Date,String转LocalDate、LocalTime、LocalDateTime等。

parse(CharSequence text) :将字符串转成对应的LocalDate,LocalTime,LocalDateTime。

LocalDate of(int year, int month, int dayOfMonth) /LocalDate of(int year, Month month, int dayOfMonth) :设置年月日,转成LocalDate。

如下面代码:

//of()
LocalDate ofDate = LocalDate.of(2022, Month.JANUARY, 31);
        System.out.println("of办法转LocalDate;" + ofDate);
//String转LocalDate,LocalTime,LocalDateTime
String date = "2020-01-01";
String time = "11:22:33";
String dateTime = "2021-09-06T09:51:51";
LocalDate localDate = LocalDate.parse(date);
LocalTime localTime= LocalTime.parse(time);
LocalDateTime localDateTime = LocalDateTime.parse(dateTime);
System.out.println("String转LocalDate,LocalTime,LocalDateTime,LocalDate;" +
        localDate + ",LocalTime:" + localTime + ",LocalDateTime:"+localDateTime);
 //date转LocalDate,LocalTime,LocalDateTime
Date date1 = new Date();
LocalDate localDate1 = LocalDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
LocalDateTime localDateTime1 = LocalDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault());
LocalTime localTime1 = LocalDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalTime();
System.out.println("date转LocalDate,LocalTime,LocalDateTime,LocalDate;" +
    localDate1 + ",LocalTime:" + localTime1 + ",LocalDateTime:"+localDateTime1);
//LocalDateTime转Date
Date from = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDateTime转Date;" + from );

输出:

of办法转LocalDate;2022-01-31

String转LocalDate,LocalTime,LocalDateTime,LocalDate;2020-01-01,LocalTime:11:22:33,LocalDateTime:2021-09-06T09:51:51

date转LocalDate,LocalTime,LocalDateTime,LocalDate;2023-05-11,LocalTime:14:30:02.562,LocalDateTime:2023-05-11T14:30:02.562

LocalDateTime转Date;Thu May 11 14:30:02 CST 2023

5、日期比较

LocalDate中供给了equals,isAfter,isBefore等办法来对日期进行比较,这对于咱们事务代码中时刻判别带来了很大的办法。

equals(Object obj) :比照两个日期是否持平,查看源码会发现,首先比较的是目标是否一样,然后别离做年,月,日的差是否等于0来进行比较。true:表明持平,false:表明不持平

compareTo(ChronoLocalDate other) :比较日期,0:表明持平,正数:表明大于,负数:表明小于。

isAfter(ChronoLocalDate other) :日期是否在other之后,true:表明是,false:表明否。相当于compareTo正负数。

isBefore(ChronoLocalDate other) :日期是否在other之前,true:表明是,false:表明否。相当于compareTo正负数。

//时刻比较
LocalDate firDate = LocalDate.of(2022, 11, 23);
LocalDate secDate = LocalDate.of(2023, 11, 23);
LocalDate thrDate = LocalDate.of(2021, 11, 23);
//equals
System.out.println("equals:" + firDate.equals(secDate));
//compareTo
System.out.println("compareTo1:" + secDate.compareTo(thrDate));
System.out.println("compareTo2:" + thrDate.compareTo(firDate));
//isAfter
System.out.println("isAfter:" + firDate.isAfter(secDate));
System.out.println("isAfter:" + secDate.isAfter(thrDate));
//isBefore
System.out.println("isBefore:" + firDate.isBefore(secDate));
System.out.println("isBefore:" + secDate.isBefore(thrDate));

输出:

equals:false

compareTo1:2

compareTo2:-1

isAfter:false

isAfter:true

isBefore:true

isBefore:false

6、查看周期性日期

在日常生活中,有许多留念含义的日期,比如说生日,国庆等等。这时候需求进行周期性查看来做一些提醒,比如:老婆的生日,这要是忘了估量跪榴莲都是轻的。哈哈哈

MonthDay这个类,就供给了of,from来获取月份与当时月份中第几天,然后运用equals进行比较即可。

//周期性查看
LocalDate birthDay = LocalDate.of(1991, 5, 11);
MonthDay birthMonth = MonthDay.of(birthDay.getMonth(), birthDay.getDayOfMonth());
MonthDay nowMonth = MonthDay.from(nowDate);
if (Objects.equals(birthMonth,nowMonth)){
    System.out.println("生日到了!");
} else {
    System.out.println("万幸,还好生日还没到呢,差点忘了......!");
}

输出:

生日到了!

7、日期核算

前段时刻做了一个需求,需求获取前13个月的日期,这是运用LocalDate就比较便利,来看看LocalDate供给的办法。

提早:

minus(long amountToSubtract, TemporalUnit unit) :核算提早的日期,ChronoUnit完成了TemporalUnit接口,供给了各种日期类型,例如:ChronoUnit.MONTHS,表明日期。

minusMonths(long monthsToSubtract) :核算提早月份的日期。

minusDays(long daysToSubtract) :核算提早天数的日期。

minusWeeks(long weeksToSubtract) :核算提早星期的日期。

minusYears(long yearsToSubtract) :核算提早年份的日期。

推后:

plus(long amountToSubtract, TemporalUnit unit) :核算推后的日期,ChronoUnit完成了TemporalUnit接口,供给了各种日期类型,例如:ChronoUnit.MONTHS,表明日期。

plusMonths(long monthsToSubtract) :核算推后月份的日期。

plusDays(long daysToSubtract) :核算推后天数的日期。

plusWeeks(long weeksToSubtract) :核算推后星期的日期。

plusYears(long yearsToSubtract) :核算推后年份的日期。

LocalDate nowDate = LocalDate.now();
//日期核算
//提早
System.out.println("两个月前的日期:" +  nowDate.minusMonths(2));
System.out.println("20天前的日期:" + nowDate.minusDays(20));
System.out.println("1星期前的日期:" + nowDate.minusWeeks(1));
System.out.println("1年前的日期:" + nowDate.minusYears(1));
System.out.println("1个月前的日期:" + nowDate.minus(1, ChronoUnit.MONTHS));
//推后
System.out.println("两个月后的日期:" + nowDate.plusMonths(2));
System.out.println("20天后的日期:" + nowDate.plusDays(20));
System.out.println("1星期后的日期:" + nowDate.plusWeeks(1));
System.out.println("1年后的日期:" + nowDate.plusYears(1));
System.out.println("1个月后的日期:" + nowDate.plus(1,ChronoUnit.MONTHS));

输出:

两个月前的日期:2023-03-11

20天前的日期:2023-04-21

1星期前的日期:2023-05-04

1年前的日期:2022-05-11

1个月前的日期:2023-04-11

两个月后的日期:2023-07-11

20天后的日期:2023-05-31

1星期后的日期:2023-05-18

1年后的日期:2024-05-11

1个月后的日期:2023-06-11

8、处理时区

java8将时区也分离了出来,用ZoneId来处理特定时区。

ZoneDateTime:表明某时区下的时刻。

//时区
ZonedDateTime of = ZonedDateTime.of(nowDateTime, ZoneId.of("Asia/Shanghai"));
System.out.println("时区:" + of);

输出:

时区:2023-05-11T16:17:11.479+08:00[Asia/Shanghai]

9、获取时刻戳

java8供给了Instant类来对时刻戳进行操作。

System.out.println("时刻戳:" + Instant.now().getEpochSecond());

时刻戳回来的是秒等级的数据。 输出:

时刻戳:1683794339

10、闰年判别

isLeapYear() :能够直接查询日期是否为闰年。true:表明是,false:表明否。

boolean leapYear = nowDate.isLeapYear();
if (leapYear){
    System.out.println("闰年!");
} else {
    System.out.println("不是闰年!");
}

输出:

不是闰年!

11、获取第一天和最终一天

有时候咱们事务需求获取当月或当年的第一天日期或最终一天日期,TemporalAdjusters类供给了一些办法能够直接完成。

TemporalAdjusters.lastDayOfMonth() :月份的最终一天日期。

TemporalAdjusters.firstDayOfMonth() :月份的第一天日期。

TemporalAdjusters.lastDayOfYear() :年份的最终一天日期。

TemporalAdjusters.firstDayOfYear() :年份的第一天日期。

例如:获取当月/当年的第一天日期和最终一天日期。

 //获取当月第一天和最终一天
LocalDate lastDay = nowDate.with(TemporalAdjusters.lastDayOfMonth());
LocalDate firstDay = nowDate.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("当月第一天:"+firstDay + ";当月最终一天:" + lastDay);
//获取当年第一天和最终一天
LocalDate lastYearDay = nowDate.with(TemporalAdjusters.lastDayOfYear());
LocalDate firstYearDay = nowDate.with(TemporalAdjusters.firstDayOfYear());
System.out.println("当年第一天:"+firstYearDay + ";当月最终一天:" + lastYearDay);

输出:

当月第一天:2023-05-01;当月最终一天:2023-05-31

当年第一天:2023-01-01;当月最终一天:2023-12-31

上述就是我在作业用到的一些java8日期时刻的办法,存在完整的地方,期望对我们有用,我们也能够写写自己在作业当中运用的日期时刻办法,一起来学习学习。

谢谢我们。