弃用Date
伴随 lambda表达式、streams 以及一系列小优化,Java 8 推出了全新的日期时间API。
Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。
全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、 长短(duration)、日期、时间、时区和周期。
同时继承了Joda 库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
不可变性 | ❌ 可变 | ✅ 不可变 |
线程安全 | ❌ 需同步 | ✅ 天生安全 |
API 设计 | ❌ 反直觉(如月份从0开始) | ✅ 人性化(如
) |
时区处理 | ❌ 混淆时刻与本地时间 | ✅ 明确区分(
/
) |
格式化 | ❌
非线程安全 | ✅
线程安全 |
功能扩展 | ❌ 基本无操作支持 | ✅ 丰富的日期时间计算 |
因此,Java 8 引入 java.time
是为了解决历史遗留问题,提供更安全、清晰、强大的日期时间处理能力。对于新代码,应优先使用新 API。
Instant:瞬时实例。
LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
LocalTime:本地时间,不包含日期。
LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。