1、概述
Java8之前
① Java8之前有date类,date类如果不格式化可读性十分差;
② simpledateformat方法中format和parse方法都是线程不安全的,不利于使用。
Java8
① 出现localdate,localdatetime,localtime这些类,使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,所以这些类都是线程安全的;
② 全新API明确了日期时间概念,例如: 瞬时(instant) 、 长短(duration) 、 日期 、 时间 、 时区和周期 。
2、核心类
① Instant :瞬时实例。
② LocalDate :本地日期,不包含具体时间 例如:2014-01-14 ;
③ LocalTime :本地时间,不包含日期;
④ LocalDateTime :组合了日期和时间,但不包含时差和时区信息;
⑤ ZonedDateTime :最完整的日期时间,包含时区和相对UTC或格林威治的时差。
新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计
3、具体使用介绍
LocalDate
LocalDate类的实例是一个不可变对象,它只提供了简单的日期,并不含时间信息,是不可变的和线程安全的。
API方法 | 描述 |
---|---|
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)获取当前日期 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());
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);
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:时分秒
常用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 | 减少纳秒数 |
compareTo | 时间与另一个时间比较 |
isAfter | 检查时间是否在指定时间之后 |
isBefore | 检查时间是否在指定时间之前 |
使用介绍
// 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()));
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) | 根据日期和时间对象获取 |
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 | 检查是否在指定日期时间之后 |
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);
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")));