Java8之前日期类所存在的问题
在Java8之前通常会使用Date结合 SimpleDateFormat、Calender来处理时间和日期的相关需求。 但是这些API也存在明显的缺点:
可读性差、易用性差、使用起来冗余繁琐
java.util.Date 是非线程安全的
java.util.Date 存在千年虫问题、并且不支持国际化和时区、故大部分方法被声明为过时、不建议再使用java.util和java.sql两包中都有Date类
Java8新增日期类
而java8在java.time包下重新实现了日期相关类。每个类功能明确清晰、类之间协作简单、API 定义清晰、功能强大无需借助外部工具类,并且线程安全。 Java8新增的日期类主要有三个:
LocalDate:表示日期(年月日)
LocalTime :表示时间(时分秒)
LocalDateTime:表示时间+ 日期 (年月日时分秒)
这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类。因此它们都是线程安全的。
LocalDate
常用API
| 方法 | 描述 |
|---|---|
| static LocalDate now() | 获取默认时区的当前日期对象 |
| static LocalDate now(Clock clock) | 从指定时钟获取当前日期对象 |
| static LocalDate now(ZoneId zone) | 获取指定时区的当前日期对象 |
| of | 根据指定年月日创建LocalDate对象 |
| getYear | 获得年份 |
| getMonthValue | 获得月份(1-12) |
| getMonth | 获得月份枚举值 |
| getDayOfMonth | 获得月份中的第几天(1-31) |
| getDayOfWeek | 获得星期几 |
| getDayOfYear | 获得年份中的第几天(1-366) |
| lengthOfYear | 获得当年总天数 |
| lengthOfMonth | 获得当月总天数 |
| toEpochDay | 与时间纪元(1970年1月1日)相差的天数 |
| plusDays | 加天 |
| plusWeeks | 加周 |
| plusMonths | 加月 |
| plusYears | 加年 |
| minusDays | 减年 |
| minusWeeks | 减周 |
| minusMonths | 减月 |
| minusYears | 减年 |
| withYear | 替换年份 |
| withMonth | 替换月份 |
| withDayOfMonth | 替换月份中的第几天(1-31) |
| withDayOfYear | 替换年份中的第几天(1-366) |
| isBefore | 是否日期在之前 |
| isAfter | 是否日期在之后 |
| isEqual | 是否是当前日期 |
| isleapYear | 是否是闰年 |
LocalTime
常用API
| 方法 | 描述 |
|---|---|
| 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 | 减少纳秒数 |
| withHour | 替换小时 |
| withMinute | 替换分钟 |
| withSecond | 替换秒钟 |
| withNano | 替换纳秒 |
| compareTo | 时间与另一个时间比较 |
| isAfter | 检查时间是否在指定时间之后 |
| isBefore | 检查时间是否在指定时间之前 |
LocalDateTime
常用API
| 方法 | 描述 |
|---|---|
| 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) | 根据指定的年、月、日、时、分、秒获取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 | 减少纳秒 |
| withYear | 替换年份 |
| withMonth | 替换月份 |
| withDayOfMonth | 替换月份中的第几天(1-31) |
| withDayOfYear | 替换年份中的第几天(1-366) |
| withHour | 替换小时 |
| withMinute | 替换分钟 |
| withSecond | 替换秒钟 |
| withNano | 替换纳秒 |
| isEqual | 判断日期时间是否相等 |
| isBefore | 检查是否在指定日期时间之前 |
| isAfter | 检查是否在指定日期时间之后 |