Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优势

1.不变性

新的日期/时间API中,全部的类都是不可变的,这对多线程环境有好处。html

好比:LocalDateTimejava

 

 

 

2.关注点分离

新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不一样的类。api

不一样时间分解成了各个类,好比:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMonth,MonthDay,DayOfWeek等,知足各类不一样场景使用需求。安全

 

3.清晰

在全部的类中,方法都被明肯定义用以完成相同的行为。多线程

举个例子,要拿到当前实例咱们可使用now()方法,在全部的类中都定义了format()和parse()方法,而不是像之前那样专门有一个独立的类。方法明确,清晰,统一,方便好记。函数

 

4.实用操做

(至关于不少工具方法,再也不须要咱们本身封装了):全部新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。工具

好比:LocalDateTime,包含很是丰富的实用操做(转换,获取各个字段,修改字段,增长和减小等)。spa

 

 

5.TemporalAdjuster 让你可以用更精细的方式操纵日期

再也不局限于一次只能改变它的 一个值,而且你还可按照需求定义本身的日期转换器。好比:将日期调整到下个周日、下个工做日,或者是本月的最后一天。.net

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

相关文章
相关标签/搜索