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) | 回来特定区域的日期时刻格局 |
注:在运用
ofLocalizedTime
,ofLocalizedDateTime
中的FormatStyle.FULL
,FormatStyle.LONG
时因为时区信息问题,一般不存储在LocalTime,LocalDateTime目标中,因此会报取不到值的过错。如:
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日期时刻的办法,存在完整的地方,期望对我们有用,我们也能够写写自己在作业当中运用的日期时刻办法,一起来学习学习。
谢谢我们。