zoukankan      html  css  js  c++  java
  • Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点

    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

  • 相关阅读:
    小程序苹果手机上video会盖住绝对定位的view层,小程序 video 层级,原生组件
    两个高斯分布乘积的理论推导
    两个高斯分布的和的分布——正态分布的再生性
    随机变量、随机向量和随机有限集的定义
    UdpClient.BeginReceive(AsyncCallback, Object) 方法
    基于C#的UDP协议的异步实现
    基于C#实现串口通信Demo
    pitch、yaw、roll三个角的区别
    dotNET Core 3.X 使用 Jwt 实现接口认证
    C#使用RabbitMQ
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/12075575.html
Copyright © 2011-2022 走看看