Java8日期时间(LocalDate、LocalTime、LocalDateTime)
在看题的时候发现了Java8中新加入的日期时间类,觉得这个小哥写的不错,自己也跟着练习下。原文地址:https://blog.csdn.net/yy139926/article/details/124298574
前言:
Java中1.8之前有date类,date类到了1.8大部分的方法被弃而且date类如果不格式化可读性十分差,而simpledateformat方法中format和parse方法都是线程不安全的。Java1.8之后出现了localdate,localdatetime,localtime这些类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类,所以这些类都是线程安全的。
一、LocalDate:年月日
LocalDate类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息,这个类是不可变的和线程安全的。
方法 | 描述 |
---|---|
now | 根据当前时间创建LocalDate对象 |
of | 根据指定年月日创建LocalDate对象 |
getYear | 获得年份 |
getMonthValue | 获得月份 |
getMonth | 获得月份枚举值 |
getDayOfMonth | 获得月份天数(1-31) |
getDayOfWeek | 获得星期几 |
getDayOfYear | 获得年份中的第几天(1-366) |
lengthOfYear | 获得当年总天数 |
lengthOfMonth | 获得当月总天数 |
toEpochDay | 与时间纪元(1970年1月1日)相差的天数 |
plusDays | 加天 |
plusWeeks | 加周 |
plusMonths | 加月 |
plusYears | 加年 |
minusDays | 减年 |
minusWeeks | 减周 |
minusMonths | 减月 |
minusYears | 减年 |
withYear | 替换年份 |
withYear | 替换年份 |
withDayOfMonth | 替换日期 |
withDayOfYear | 替换日期 |
isBefore | 是否日期在之前 |
isAfter | 是否日期在之后 |
isEqual | 是否是当前日期 |
isleapYear | 是否是闰年 |
1.1、LocalDate常用API
//A.获取 //(1)获取当前日期 2022-07-07 System.out.println(LocalDate.now()); //(2)获取指定日期 2000-03-05 System.out.println(LocalDate.of(2014, 3, 5)); //(3)获取日期的年份 2022 System.out.println(LocalDate.now().getYear()); //(4)获取日期的月份 7 System.out.println(LocalDate.now().getMonthValue()); //(5)获取日期的日子 7 System.out.println(LocalDate.now().getDayOfMonth()); //(6)获取日期的星期 THURSDAY System.out.println(LocalDate.now().getDayOfWeek()); //(7)当天所在这一年的第几天 188 System.out.println(LocalDate.now().getDayOfYear()); //(8)获取当年天数 365 System.out.println(LocalDate.now().lengthOfYear()); //(9)获取当月天数 31 System.out.println(LocalDate.now().lengthOfMonth()); //(10)与时间纪元(1970年1月1日)相差的天数,负数表示在时间纪元之前多少天 19180 System.out.println(LocalDate.now().toEpochDay()); //B.运算 //(1)加一天 System.out.println("加1天:" + LocalDate.now().plusDays(1)); //(2)加一周 System.out.println("加1周:" + LocalDate.now().plusWeeks(1)); //(3)加一月 System.out.println("加1月:" + LocalDate.now().plusMonths(1)); //(4)加一年 System.out.println("加1年:" + LocalDate.now().plusYears(1)); //(5)减一天 System.out.println("减1天:" + LocalDate.now().minusDays(1)); //(6)减一周 System.out.println("减1周:" + LocalDate.now().minusWeeks(1)); //(7)减一月 System.out.println("减1月:" + LocalDate.now().minusMonths(1)); //(8)减一年 System.out.println("减1年:" + LocalDate.now().minusYears(1)); //C.替换 //(1)替换年份:2000-07-07 System.out.println("替换年份为2000:" + LocalDate.now().withYear(2000)); //(2)替换月份:2020-01-07 System.out.println("替换月份为1:" + LocalDate.now().withMonth(1)); //(3)替换日子:2020-07-01 System.out.println("替换日期为1:" + LocalDate.now().withDayOfMonth(1)); //(4)替换天数:一年中的第多少天 System.out.println("替换天数为1:" + LocalDate.now().withDayOfYear(1)); //D.比较 //(1)是否在当天之前 System.out.println("是否在当天之前:" + LocalDate.now().minusDays(1).isBefore(LocalDate.now())); //(2)是否在当天之后 System.out.println("是否在当天之后:" + LocalDate.now().plusDays(1).isAfter(LocalDate.now())); //(3)是否在当天 System.out.println("是否在当天:" + LocalDate.now().isEqual(LocalDate.now())); //(4)是否是闰年 System.out.println("今年是否是闰年:" + LocalDate.now().isLeapYear());
1.2、LocalDate 与 String 之间的转换
//(1)从文本字符串获取LocalDate实例 LocalDate localdate = LocalDate.parse("2022-04-21"); System.out.println(localdate); //(2)使用特定格式化形式从文本字符串获取LocalDate实例 String str = "2019-03-03"; DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse(str, fmt1); System.out.println(date); //(3)使用特定格式化形式将LocalDate转为字符串 LocalDate today = LocalDate.now(); DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String dateStr = today.format(fmt); System.out.println(dateStr);
1.3、LocalDate 与 Date之间的转换
//(1)LocalDate转化为Date ZonedDateTime zonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault()); Date date = Date.from(zonedDateTime.toInstant()); System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date)); //(2)Date转化为LocalDate LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); System.out.println(localDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
二、LocalTime:时分秒
方法 | 描述 |
---|---|
static LocalTime now() | 获取默认时区的当前时间 |
static LocalTime now(ZoneId zone) | 获取指定时区的当前时间 |
static LocalTime now(Clock clock) | 从指定时钟获取当前时间 |
of | 根据指定的时、分、秒获取LocalTime 实例 |
getHour | 获取小时字段 |
getMinute | 获取分钟字段 |
getSecond | 获取秒字段 |
getNano | 获取纳秒字段 |
plusHours | 增加小时数 |
plusMinutes | 增加分钟数 |
plusSeconds | 增加秒数 |
plusNanos | 增加纳秒数 |
minusHours | 减少小时数 |
minusMinutes | 减少分钟数 |
minusSeconds | 减少秒数 |
minusNanos | 减少纳秒数 |
compareTo | 时间与另一个时间比较 |
isAfter | 检查时间是否在指定时间之后 |
isBefore | 检查时间是否在指定时间之前 |
2.1、LocalTime常用API
//A.获取 //(1)获取默认时区的当前时间 14:11:31.294 System.out.println(LocalTime.now()); //(2)获取指定时区的当前时间 14:11:31.392 System.out.println(LocalTime.now(ZoneId.of("Asia/Shanghai"))); //(3)从指定时钟获取当前时间 14:11:31.392 System.out.println(LocalTime.now(Clock.systemDefaultZone())); //(4)指定获取时分秒 System.out.println(LocalTime.of(12, 30, 30)); //(5)指定获取时分 System.out.println(LocalTime.of(12, 30)); //(6)指定获取时分秒纳秒 System.out.println(LocalTime.of(12, 30, 30, 123)); //(7)获取小时字段 System.out.println("时: " + LocalTime.now().getHour()); //(8)获取分钟字段 System.out.println("分: " + LocalTime.now().getMinute()); //(9)获取秒字段 System.out.println("秒: " + LocalTime.now().getSecond()); //(10)获取纳秒字段 System.out.println("纳秒: " + LocalTime.now().getNano()); //B.计算 //(1)增加一小时 System.out.println("增加1小时: " + LocalTime.now().plusHours(1)); //(2)增加三十分钟 System.out.println("增加30分钟: " + LocalTime.now().plusMinutes(30)); //(3)增加三十秒 System.out.println("增加30秒: " + LocalTime.now().plusSeconds(30)); //(4)增加一万纳秒 System.out.println("增加10000纳秒:" + LocalTime.now().plusNanos(10000)); //(5)减少一小时 System.out.println("减少1小时: " + LocalTime.now().minusHours(1)); //(6)减少三十分钟 System.out.println("减少30分钟: " + LocalTime.now().minusMinutes(30)); //(7)减少三十秒 System.out.println("减少30秒: " + LocalTime.now().minusSeconds(30)); //(8)减少一万纳秒 System.out.println("减少10000纳秒:" + LocalTime.now().minusNanos(10000)); //C.比较 //(1)时间与另一个时间比较 0(相等)正数(大)负数(小) System.out.println(LocalTime.now().compareTo(LocalTime.now())); //(2)检查时间是否在指定时间之后 System.out.println(LocalTime.now().isAfter(LocalTime.now())); //(3)检查时间是否在指定时间之前 System.out.println(LocalTime.now().isBefore(LocalTime.now()));
2.2、LocalTime与 String 之间的转换
//(1)从文本字符串获取LocalTime实例 LocalTime localTime1 = LocalTime.parse("12:30:30"); System.out.println(localTime1); //(2)使用特定格式化形式从文本字符串获取LocalTime实例 LocalTime localTime2 = LocalTime.parse("12:30:30", DateTimeFormatter.ofPattern("HH:mm:ss")); System.out.println(localTime2); //(3)使用特定格式化形式将LocalTime转为字符串 DateTimeFormatter df1 = DateTimeFormatter.ofPattern("HH:mm:ss"); LocalTime localTime3 = LocalTime.now(); System.out.println(localTime3.format(df1));
三、LocalDateTime:年月日时分秒
方法 | 描述 |
---|---|
static LocalDateTime now() | 获取默认时区的当前日期时间 |
static LocalDateTime now(Clock clock) | 从指定时钟获取当前日期时间 |
static LocalDateTime now(ZoneId zone) | 获取指定时区的当前日期时间 |
static LocalDateTime of(LocalDate date, LocalTime time) | 根据日期和时间对象获取LocalDateTime 实例 |
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) | second) 根据指定的年、月、日、时、分、秒获取LocalDateTime 实例 |
getYear | 获取年份 |
getMonth | 使用月份枚举类获取月份 |
getDayOfMonth | 获取日期在该月是第几天 |
getDayOfWeek | 获取日期是星期几 |
getDayOfYear | 获取日期在该年是第几天 |
getHour | 获取小时 |
getMinute | 获取分钟 |
getSecond | 获取秒 |
getNano | 获取纳秒 |
plusYears | 增加年 |
plusMonths | 增加月 |
plusWeeks | 增加周 |
plusDays | 增加天 |
plusHours | 增加小时 |
plusMinutes | 增加分 |
plusSeconds | 增加秒 |
plusNanos | 增加纳秒 |
minusYears | 减少年 |
minusMonths | 减少月 |
meminusWeeks | 减少周 |
minusDays | 减少天 |
minusHours | 减少小时 |
minusMinutes | 减少分 |
minusSeconds | 减少秒 |
minusNanos | 减少纳秒 |
isEqual | 判断日期时间是否相等 |
isBefore | 检查是否在指定日期时间之前 |
isAfter | 检查是否在指定日期时间之后 |
3.1、LocalDateTime常用API
//A.获取 //(1)获取默认时区的当前日期时间 System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); //(2)获取指定时区的当前日期时间 System.out.println(LocalDateTime.now(ZoneId.of("Asia/Shanghai"))); //(3)从指定时钟获取当前日期时间 System.out.println(LocalDateTime.now(Clock.systemDefaultZone())); //(4)根据日期和时间对象获取LocalDateTime实例 System.out.println(LocalDateTime.of(LocalDate.now(), LocalTime.now())); //(5)根据指定的年、月、日、时、分、秒获取LocalDateTime实例 System.out.println(LocalDateTime.of(2019, 12, 7, 21, 48, 50)); //(6)获取年份 System.out.println("年 : " + LocalDateTime.now().getYear()); //(7)使用月份枚举类获取月份 System.out.println("月(英文) : " + LocalDateTime.now().getMonth()); //(8) 使用月份数字类获取月份 System.out.println(" 月(数字英文): " + LocalDateTime.now().getMonth().getValue()); //(9)获取日期在该月是第几天 System.out.println("天 : " + LocalDateTime.now().getDayOfMonth()); //(10)获取日期是星期几(英文) System.out.println("星期几(英文) : " + LocalDateTime.now().getDayOfWeek()); //(11)获取日期是星期几(数字英文) System.out.println("星期几(数字英文) : " + LocalDateTime.now().getDayOfWeek().getValue()); //(12)获取日期在该年是第几天 System.out.println("本年的第几天 : " + LocalDateTime.now().getDayOfYear()); //(13)获取小时 System.out.println("时: " + LocalDateTime.now().getHour()); //(14)获取分钟 System.out.println("分: " + LocalDateTime.now().getMinute()); //(15)获取秒 System.out.println("秒: " + LocalDateTime.now().getSecond()); //(16)获取纳秒 System.out.println("纳秒: " + LocalDateTime.now().getNano()); //B.计算 //(1)增加天数 System.out.println("增加天数 : " + LocalDateTime.now().plusDays(1)); //(2)增加周数 System.out.println("增加周数 : " + LocalDateTime.now().plusWeeks(1)); //(3)增加月数 System.out.println("增加月数 : " + LocalDateTime.now().plusMonths(1)); //(4)增加年数 System.out.println("增加年数 : " + LocalDateTime.now().plusYears(1)); //(5)减少天数 System.out.println("减少天数 : " + LocalDateTime.now().minusDays(1)); //(6)减少月数 System.out.println("减少月数 : " + LocalDateTime.now().minusMonths(1)); //(7)减少周数 System.out.println("减少周数 : " + LocalDateTime.now().minusWeeks(1)); //(8)减少年数 System.out.println("减少年数 : " + LocalDateTime.now().minusYears(1)); //(9)增加小时 System.out.println("增加1小时: " + LocalDateTime.now().plusHours(1)); //(10)增加分钟 System.out.println("增加30分钟: " + LocalDateTime.now().plusMinutes(30)); //(11)增加秒数 System.out.println("增加30秒: " + LocalDateTime.now().plusSeconds(30)); //(12)增加纳秒 System.out.println("增加10000纳秒:" + LocalDateTime.now().plusNanos(10000)); //(13)减少小时 System.out.println("减少1小时:" + LocalDateTime.now().minusHours(1)); //(14)减少分钟 System.out.println("减少30分钟:" + LocalDateTime.now().minusMinutes(30)); //(15)减少秒数 System.out.println("减少30秒: " + LocalDateTime.now().minusSeconds(30)); //(16)减少纳秒 System.out.println("减少10000纳秒:" + LocalDateTime.now().minusNanos(10000)); //C.比较 //(1)判断日期时间是否相等 System.out.println(LocalDateTime.now().isEqual(LocalDateTime.now())); //(2)检查是否在指定日期时间之前 System.out.println(LocalDateTime.now().isBefore(LocalDateTime.now())); //(3)检查是否在指定日期时间之后 System.out.println(LocalDateTime.now().isAfter(LocalDateTime.now()));
3.2、LocalDateTime与 String 之间的转换
//(1)获取日期部分 System.out.println(LocalDateTime.now().toLocalDate()); //(2)获取时间部分:时、分、秒 System.out.println(LocalDateTime.now().toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm:ss"))); //(3)从文本字符串获取LocalDateTime实例 LocalDateTime ldt2 = LocalDateTime.parse("2019-12-07T21:20:06.303995200"); System.out.println(ldt2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); //(4)使用特定格式化形式从文本字符串获取LocalDateTime实例 DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime ldt3 = LocalDateTime.parse("2019-12-07 21:20:06", df1); System.out.println(ldt3); //(5)使用特定格式化形式将LocalDateTime转为字符串 String ldt4 = df1.format(ldt3); System.out.println(ldt4);
3.3、LocalDateTime与 Date之间的转换
//(1)LocalDateTime转化为Date ZonedDateTime zdt = LocalDateTime.now().atZone(ZoneId.systemDefault()); Date date1 = Date.from(zdt.toInstant()); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date1)); //(2)Date转化为LocalDateTime LocalDateTime localDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));