1. 不变性
新的日期 / 时间 API 中, 所有的类都是不可变的, 这对多线程环境有好处.
比如: LocalDateTime
2. 关注点分离
新的 API 将人可读的日期时间和机器时间 (unix timestamp) 明确分离, 它为日期 (Date), 时间(Time), 日期时间(DateTime), 时间戳(unix timestamp) 以及时区定义了不同的类.
不同时间分解成了各个类, 比如: LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMonth,MonthDay,DayOfWeek 等, 满足各种不同场景使用需求.
3. 清晰
在所有的类中, 方法都被明确定义用以完成相同的行为.
举个例子, 要拿到当前实例我们可以使用 now()方法, 在所有的类中都定义了 format()和 parse()方法, 而不是像以前那样专门有一个独立的类. 方法明确, 清晰, 统一, 方便好记.
4. 实用操作
(相当于很多工具方法, 不再需要我们自己封装了): 所有新的日期 / 时间 API 类都实现了一系列方法用以完成通用的任务, 如: 加, 减, 格式化, 解析, 从日期 / 时间中提取单独部分, 等等.
比如: LocalDateTime, 包含非常丰富的实用操作(转换, 获取各个字段, 修改字段, 增加和减少等).
5.TemporalAdjuster 让你能够用更精细的方式操纵日期
不再局限于一次只能改变它的 一个值, 并且你还可按照需求定义自己的日期转换器. 比如: 将日期调整到下个周日, 下个工作日, 或者是本月的最后一天.
lastDayOfMonth 创建一个新的日期, 它的值为当月的最后一天.
6. 对比 Jdk7 及以前的日期时间类的缺点改进
6.1 Date 和 Calendar 的不方便使用问题
(1)new Date(2019,01,01)实际是 3919 年 2 月. 因为 Date 的构造函数 的年份表示的始于 1900 年的差值.
LocalDate 创建实例:
LocalDate localDate = LocalDate.of(2019, 1, 1);
(2)month 是从 0 开始的.
LocalDate month 是从 1 开始的:
- LocalDate localDate = LocalDate.of(2019, 1, 1);
- System.out.println(localDate.getMonthValue());
输出是 1
(3)DAY_OF_WEEK 的取值, 是从周日 (1) 开始的.
LocalDate week 是从周一 (1) 开始的:
- LocalDate localDate = LocalDate.of(2019, 1, 1);
- System.out.println(localDate.getDayOfWeek());
- System.out.println(localDate.getDayOfWeek().getValue());
输出
TUESDAY 2
(4)Date 如果不格式化, 打印出的日期可读性差.
LocalDate 的输出, 清晰.
- LocalDate localDate = LocalDate.of(2019, 1, 1);
- System.out.println(localDate.getMonthValue());
- System.out.println(localDate.toString());
输出:
2019-01-01
(5)日期类并不提供国际化, 没有时区支持
java8 的时间类都支持了时区操作.
例如: LocalDateTime
- // 中国时间, 输出时不包含时区
- LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
- System.out.println(ldt);
- // 意大利罗马时间, 输出时包含时区
- ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Rome"));
- System.out.println(zdt);
输出
- 2019-12-20T23:17:07.914
- 2019-12-20T16:17:07.915+01:00[Europe/Rome]
6.2 线程安全问题
(1)Date,Calendar 可变性, 线程安全问题
java8 中所有类都是 final 修饰的, 每次修改都会生成新的副本.
(2)DateFormat 和 SimpleDateFormat 线程安全问题
java8 中的 DateTimeFormatter 也是不可变的, 源码:
6.3 java8 对日期 API 进行系统的设计, 增加了许多实用方便的操作, 几乎不用再使用 dateutil 额外工具类.
比如, 增加一天.
- LocalDate localDate = LocalDate.of(2019, 1, 1);
- LocalDate localDate2 = localDate.plusDays(1);
- System.out.println("localDate:"+localDate);
- System.out.println("localDate2:"+localDate2);
输出:
- localDate:2019-01-01
- localDate2:2019-01-02
参考: https://blog.csdn.net/wangsun300/article/details/103403490
来源: http://www.bubuko.com/infodetail-3342139.html