旧的 Java 日期 API 也就是 Java 8 之前的日期 API 之烂是公认的。一方面在于它设计分工上不明确,往往一个类既能处理日期又能处理时间,很混乱;另一方面,在某些年月日期的数值映射存储违反人们的正常认知,如 0 对应月份一月、11 对应月份十二月等,Java 8进行了优化,常用的例子如下。
- 常用
//获取当前时间并格式化
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间: "+format.format(LocalDateTime.now()));
//DateTimeFormatter提供了一些默认的格式化器,DateTimeFormatter.ISO_LOCAL_DATE_TIME 格式 yyyy-MM-ddTHH:mm:ss.SSS
String dateTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("当前时间:"+dateTime);
// 是否是生日
MonthDay monthDay = MonthDay.parse("--05-18");
MonthDay monthDay1 = MonthDay.from(LocalDate.now());
System.out.println(monthDay.getMonthValue());
if (monthDay.equals(monthDay1))
{
System.out.println("今天是生日");
}else {
System.out.println("今天不是生日");
}
//判断是否闰年
YearMonth yearMonth = YearMonth.from(LocalDate.now());
yearMonth.isLeapYear();
//信用卡过期,只有年月信息
YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);
System.out.printf("信用卡过期时间:", creditCardExpiry.toString());
- 计算下一个工作日的日期
// 计算下一个工作日的日期
TemporalAdjuster nextWorkDay = TemporalAdjusters.ofDateAdjuster(
tdate->{
DayOfWeek work = tdate.getDayOfWeek();
int addDays=0;
if (work.equals(DayOfWeek.FRIDAY)) {
addDays=3;
}else if(work.equals(DayOfWeek.SATURDAY)){
addDays=2;
}else {
addDays=1;
}
return tdate.plusDays(addDays);
}
);
LocalDate localDate1 = LocalDate.now().with(nextWorkDay);
System.out.println(localDate1);
- 特殊日期
LocalDate localDate = LocalDate.now();
//计算下一个月的第一天的日期
System.out.println("下一个月的第一天的日期: "+localDate.plusMonths(1).with(TemporalAdjusters.firstDayOfMonth()));
LocalDateTime dateTime = LocalDateTime.now();
//计算一年前的第二个月的最后一天的日期
dateTime = dateTime.minusYears(1) // 一年前
.withMonth(2) // 设置为2月
.with(TemporalAdjusters.lastDayOfMonth()); // 一个月中的最后一天
System.out.println("一年前的第二个月的最后一天的日期"+dateTime);
//当月最后一个满足是星期四的日期
LocalDate date = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY));
System.out.println("当月最后一个满足是星期四的日期:"+date);
//当前日期的前一个星期天,如果当天就是星期天
LocalDate dateTwo = localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
System.out.print("当前日期的前一个星期天:"+dateTwo);