java8新特性回顾(三)

来源:互联网 发布:c语言运行快捷键 编辑:程序博客网 时间:2024/05/01 04:56

1.java.time api

为什么需要新的日期/时间API:

可变性:像时间和日期这样的类应该是不可变的。而java.util.Date与java.util.Calendar中的所有属性都是可变的,给计算和传参造成不便。
偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
格式化:格式化只对Date有用,Calendar则不行。用于格式化和解析的类在另一个java.text包中定义
线程安全:SimpleDateFormat被设计成非线程安全的。
命名: java.util.Date 根本不是“日期”,而是1970-01-01Z开始计时经过的毫秒数所对应的“时间点”, java.util.Calendar 也不是真实的日历。java.sql.Date和java.util.Date重名也不是好的设计。


java8 time api原则

不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
清晰:在所有的类中,方法都被明确定义用以完成相同的行为。举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。
实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非IOS的日历上。


Java8日期/时间API包含以下相应的包:
java.time包:这是新的Java日期/时间API的基础包,所有的主要基础类都是这个包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。
java.time.chrono包:这个包为非ISO的日历系统定义了一些泛化的API,我们可以扩展AbstractChronology类来创建自己的日历系统。
java.time.format包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使用它们,因为java.time包中相应的类已经提供了格式化和解析的方法。
java.time.temporal包:这个包包含一些时态对象,我们可以用其找出关于日期/时间对象的某个特定日期或时间,比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有“withXXX”的格式。
java.time.zone包:这个包包含支持不同时区以及相关规则的类。


原创粉丝点击