在Java8之前,处理日期时间的类是Date、Calendar,这两个在使用起来总是让人感觉不是很舒服,在设计上面有一些缺陷,并且java.util.Date和SimpleDateFormatter都不是线程安全的. 作为JDK1.8 推出的LocalDate、LocalTime、LocalDateTime这个三个时间处理类,主要用来弥补之前的日期时间类的不足,简化日期时间的操作. 在格式化操作方面,也推出了一个新的格式化类DateTimeFormatter。
除此之外,java.time包中了就提供了不少强大的日期和时间API,如下:
- 本地日期和时间类(业务常用,重点):LocalDateTime(日期和时间),LocalDate(日期),LocalTime(时间)
- 带时区的日期和时间类:ZonedDateTime
- 时刻类:Instant
- 时间间隔:Duration
LocalDate
@Test
public void testLocalDate() {
// 获取今天的日期
LocalDate today = LocalDate.now();
System.out.println("获取今天的日期 = " + today);
// 构造日期LocalDate(严格按照yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式 )
LocalDate localDate = LocalDate.parse("2023-02-01");
System.out.println("将String类型日期格式化成LocalDate类型 = " + localDate);
// 将LocalDate格式化成字符串
DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String text = today.format(formatters);
System.out.println("将LocalDate格式化成字符串 = " + text);
// 今天是几号
int dayUfMonth = today.getDayOfMonth();
System.out.println("今天是几号 = " + dayUfMonth);
// 今天是周几(返回的是个枚举类型,需要再getValue())
int dayOfWeek = today.getDayOfWeek().getValue();
System.out.println("今天是周几 = " + dayOfWeek);
// 今天是今年中的第几天
int dayOfYear = today.getDayOfYear();
System.out.println("今天是今年中的第几天 = " + dayOfYear);
// 获取当前月份
int value = today.getMonth().getValue();
System.out.println("今天是第几月 = " + value);
// 获取当前年份
int year = today.getYear();
System.out.println("当前年份 = " + year);
// 判断当前年份是否是闰年
boolean leapYear = today.isLeapYear();
System.out.println("是否是闰年 = " + leapYear);
// 判断当月有几天
int length = today.getMonth().length(leapYear);
System.out.println("当月有几天 = " + length);
// 获取当天开始时间(获取的是年月日类型的)【转换成日期时间后,时间是00:00】
LocalDateTime localDateTime = today.atStartOfDay();
System.out.println("获取当天开始时间 = " + localDateTime);
// 设置当前月份的指定天数的日期
LocalDate dayOfMonth = today.withDayOfMonth(3);
System.out.println("当前月份的指定天数的日期 = " + dayOfMonth);
// 设置当前年份指定天数的日期
LocalDate dayOfYear1 = today.withDayOfYear(115);
System.out.println("当前年份指定天数的日期 = " + dayOfYear1);
// 当前日期向后推几天
LocalDate plusDays = today.plusDays(4);
System.out.println("当前日期向后推4天 = " + plusDays);
// 当前日期向前推几天
LocalDate minusDays = today.minusDays(4);
System.out.println("当前日期向前推4天 = " + minusDays);
// 当前日期向后推几个时间单位
LocalDate plusWeeks = today.plus(4, ChronoUnit.WEEKS);
System.out.println("当前日期向后推4个星期 = " + plusWeeks);
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("本月第1天 = " + firstDayOfThisMonth);
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
System.out.println("本月第2天 = " + secondDayOfThisMonth);
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("本月最后一天 = " + lastDayOfThisMonth);
// 取下一天:
LocalDate firstDayOfNextMonth = lastDayOfThisMonth.plusDays(1);
System.out.println("本月最后一天的下一天 = " + firstDayOfNextMonth);
// 取2023年2月第一个周一:
LocalDate firstMondayOf2023= LocalDate.parse("2023-02-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println("2023年2月第一个周一 = " + firstMondayOf2023);
}
LocalTime
@Test
public void testLocalTime() {
// 获取当前时间
LocalTime localTime = LocalTime.now();
System.out.println("当前时间 = " + localTime); //16:45:10.764
// 构造时间
LocalTime zero = LocalTime.of(0, 0, 0);
System.out.println("构造时间方法1 = " + zero);
LocalTime mid = LocalTime.parse("12:00:00");
System.out.println("构造时间方法2 = " + mid);
// 获取当前时间分钟数
int minute = localTime.getMinute();
System.out.println("当前时间分钟数 = " + minute);
// 当前时间向后推指定分钟数
LocalTime plusMinutes = localTime.plusMinutes(10);
System.out.println("当前时间向后推10分钟 = " + plusMinutes);
// 当前时间向后增加几个时间单位
LocalTime plusUnit = localTime.plus(1, ChronoUnit.MINUTES);
System.out.println("前时间向后增加1分钟 = " + plusUnit);
// 根据指定的单位计算到另一个时间为止的时间量
long until = localTime.until(mid, ChronoUnit.HOURS);
System.out.println("当前时间到12点的时间差(小时) = " + until);
// 判断此时间是否在指定时间之后。
boolean after = localTime.isAfter(mid);
System.out.println("当前时间是否在12时之后 = " + after);
// 判断此时间和指定时间大小(大:1, 等于:0, 小于:-1)
int i = localTime.compareTo(mid);
System.out.println("当前时间和12时进行比较 = " + i);
}
LocalDateTime
@Test
public void testLocalDateTime() {
// 获取当前年月日时分秒信息(时期)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前年月日时分秒 = " + localDateTime); //2023-02-01T17:43:23.105, 这里的表示分隔符, 将日期和时间分开
// 转换成LocalDate和LocalTime
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();
// 当前LocalDateTime时间转指定格式字符串*
String localDateTimeStr = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当前时间转指定格式字符串 = " + localDateTimeStr);
// 将字符串转换成LocalDateTime*
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parse = LocalDateTime.parse(localDateTimeStr, df);
System.out.println("当字符串转换成时间 = " + parse);
// 将localDateTime转换成Date
Date from = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("将localDateTime转换成Date = " + from);
// 将Date转换成将localDateTime转换成Date
LocalDateTime ldt = Instant.ofEpochMilli(from.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("将Date转换成将localDateTime转换成Date = " + ldt);
// 获取当前日期相关api
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
System.out.println("当前是周几 = " + dayOfWeek); //WEDNESDAY
// 获取当前时间相关api
int hour = localDateTime.getHour();
System.out.println("获取当前小时 = " + hour);
// 当前时期几天后的时间
LocalDateTime plusDays = localDateTime.plusDays(1);
System.out.println("当前时期一天后的时间 = " + plusDays);
// 当前时期是否在指定时期之后
boolean after = localDateTime.isAfter(ldt);
System.out.println("当前时期是否在指定时期之后 = " + after);
// 指定当前减去几小时
LocalDateTime minusHours= localDateTime.minusHours(2);
System.out.println("指定当前减去2小时 = " + minusHours);
}