本文全文参考 https://www.bilibili.com/video
日期时间API的迭代:
- 第一代:jdk 1.0 Date类
- 第二代:jdk 1.1 Calendar类,一定程度上替换Date类
- 第三代:jdk 1.8 提出了新的一套API
前两代存在的问题举例:
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date用,Calendar则不行。
- 此外,它们也不是线程安全的;不能处理闰秒等。
java 8 中新的日期时间API涉及到的包
本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间的使用(LocalDateTime)
4.1 说明:
- ① 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
- ② LocalDateTime相较于LocalDate、LocalTime,使用频率要高
- ③ 类似于Calendar
4.2 常用方法:
// now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now(); // 2020-03-24
LocalTime localTime = LocalTime.now(); // 10:25:45.991
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-03-24T10:25:45.991
// of():设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime of = LocalDateTime.of(2020, 3, 24, 10, 41, 59);
System.out.println(of); // 2020-03-24T10:41:59
// getXxx()
localDateTime.getDayOfWeek();//TUESDAY
localDateTime.getDayOfMonth(); //24
localDateTime.getDayOfYear(); //84
localDateTime.getMinute(); // 46
localDateTime.getHour(); // 10
localDateTime.getMonth(); //MARCH
localDateTime.getMonthValue(); // 3
localDateTime.getYear(); // 2020
// withXxx()-----不可变性
// 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
LocalDate localDate1 = localDate.withDayOfMonth(23); // 设置月份天数
System.out.println(localDate); //2020-03-24 原来的值没有改变
System.out.println(localDate1); //2020-03-23
LocalDateTime localDateTime1 = localDateTime.withHour(11); // 设置小时数
// plusXxx()----不可变性
// 向当前对象添加几天、几周、几个月、几年、几小时
LocalDateTime localDateTime2 = localDateTime.plusMonths(3);
// minusXxx()----不可变性
// 从当前对象减去几月、几周、几天、几年、几小时
LocalDateTime localDateTime3 = localDateTime.minusHours(12);
时间点:Instant
5.1 说明:
- ① 时间线上的一个瞬时点。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数。)
- 类似于 java.util.Date类
5.2 常用方法:
// now()
Instant instant = Instant.now();
System.out.println(instant); // 2020-03-24T03:12:11.347Z
// atOffset()
OffsetDateTime offset = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offset); // 2020-03-24T11:14:16.681+08:00
// toEpochMilli()
long epochMilli = instant.toEpochMilli();
System.out.println(epochMilli); // 1585019727730
// ofEpochMilli() 根据毫秒数创建Instant对象
Instant instant1 = Instant.ofEpochMilli(1585019727730L);
System.out.println(instant1);
日期时间格式化类:DateTimeFormatter
6.1 说明:
- ① 格式化或解析日期、时间
- ② 类似于SimpleDateFormat
6.2 常用方法:
- ① 实例化方式:
- 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
- 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
- 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
- ② 常用方法:
- 特别的:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
//预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // // 2020-03-24T11:28:20.175
String format = formatter.format(localDateTime);
System.out.println(format); // 2020-03-24T11:28:20.175
// 解析:字符串--》日期
TemporalAccessor parse = formatter.parse("2020-03-24T11:28:20.175");
System.out.println(parse); // {},ISO resolved to 2020-03-24T11:28:20.175
// 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
String format1 = formatter1.format(localDateTime);
System.out.println(format1); // 2020年3月24日 上午11时33分31秒
// *重点:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);