我是靠谱客的博主 含蓄秋天,最近开发中收集的这篇文章主要介绍Java 8(七):新的Date 和 Time API,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 1、为什么会引入新的API
    • 2、java.time 包
      • 2.1、java.time
      • 2.2、java.time.chrono
      • 2.3、java.time.format
      • 2.4、java.time.temporal
      • 2.5、java.time.zone
    • 3、用于表示本地日期和时区的新类
      • 3.1、java.time.LocalDate
        • 3.1.1、创建当前日期和特定日期
        • 3.1.2、从LocalDate获取年,月,日
        • 3.1.3、向LocalDate添加或减去天,月,周和年
        • 3.1.4、比较LocalDate对象
        • 3.1.5、从LocalDate获取月或年的天数
        • 3.1.6、检查给定年份是否为闰年
        • 3.1.7、将String转换为LocalDate的API
        • 3.1.8、将LocalDate转换为java中的String
      • 3.2、java.time.LocalTime
        • 3.2.1、LocalTime 对象创建
        • 3.2.2、从LocalTime获取Hour,Minute,Second 方法
        • 3.2.3、向LocalTime添加或减去小时,分钟和秒 方法
        • 3.2.4、比较Java中的LocalTime对象的方法
        • 3.2.5、将String转换为LocalTime的方法
        • 3.2.6、将LocalTime转换为String的方法
      • 3.3、LocalDateTime
        • 3.3.1、从LocalDateTime获取当前日期时间和特定日期时间对象
        • 3.3.2、从LocalDateTime获取年,月,日
        • 3.3.3、从LocalDateTime获取Hour,Minute,Second
        • 3.3.4、用LocalDateTime添加或减去年,月,日,小时,分钟和秒
        • 3.3.5、比较Java中的LocalDateTime对象
        • 3.3.6、从LocalDateTime转换为LocalDate
        • 3.3.7、从LocalDateTime转换为LocalTime
    • 4、用于表示时间戳(timestamp )和持续时间(duration)的新类
      • 4.1、Instant
      • 4.2、Duration
      • 4.3、Period

1、为什么会引入新的API

在旧版的 Java 中,日期时间 API 存在很多问题:

非线程安全

java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

设计很差
Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

时区处理繁琐

日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

JDK 1.8 中的新日期和时间API解决了旧API中的许多问题,并且借鉴了 Joda Time API 。新的java.time 包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

2、java.time 包

JDK 1.8 引入了五个新的日期和时间API包,如下:

2.1、java.time

这是新的Java日期/时间API的基础包,它是基于ISO-8601标准的API,所有的主要基础类都是这个包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。

2.2、java.time.chrono

java.time.chrono 包含日历API。 这适用于需要使用本地化日历的应用程序。 为Hijrah,Japanese,Minguo和ThaiBuddhist日历提供支持。我们可以扩展AbstractChronology类来创建自己的日历系统。

2.3、java.time.format

java.time.format 包含能够格式化和解析日期时间对象的API,可以通过各种方式创建格式化程序,包括常量,模式,本地化样式和构建器。 格式化程序是不可变的和线程安全的。

2.4、java.time.temporal

java.time.temporal包含用于访问日期时间字段和单位的API。单位是可衡量的,例如年,月和小时。例如,表达“2小时后”使用小时单位。例如,年的月份(month-of-year),星期几(day-of-week)和小时(hour-of-day )都是字段。如果需要,可以通过应用程序扩展受支持的单元和字段集。

2.5、java.time.zone

java.time.zone包含处理时区的API。 提供有关每个时区规则的详细信息。

3、用于表示本地日期和时区的新类

3.1、java.time.LocalDate

LocalDate 类表示日期。 没有时间或时区的表示。是一个不可变的类,它表示默认格式(yyyy-MM-dd)的日期,我们可以使用now()方法得到当前时间,也可以提供输入年份、月份和日期的输入参数来创建一个LocalDate实例。该类为now()方法提供了重载方法,我们可以传入ZoneId来获得指定时区的日期,该类提供与java.sql.Date相同的功能.

3.1.1、创建当前日期和特定日期

LocalDate类提供以下API以创建当前日期和特定日期。

  • static LocalDate now() - 在默认时区中从系统时钟获取当前日期。
  • static LocalDate now(Clock clock) - 从指定的时钟获取当前日期。
  • static LocalDate now(ZoneId zone) - 从指定时区的系统时钟获取当前日期。
  • static LocalDate of(int year, int month, int dayOfMonth) - 从年,月和日获得LocalDate的实例。
  • static LocalDate of(int year, Month month, int dayOfMonth) - 从年,月和日获得LocalDate的实例。
/**
     * 创建当前日期和特定日期
     */
    public static void createLocalDate() {
        // 在默认时区中从系统时钟获取当前日期。
        LocalDate localDate = LocalDate.now();
        System.out.println("LocalDate.now():" + localDate);
        // 从指定的时钟获取当前日期。
        LocalDate localDate1 = LocalDate.now(Clock.systemDefaultZone());
        System.out.println("LocalDate.now(Clock.systemDefaultZone()):" + localDate1);
        // 从指定时区的系统时钟获取当前日期。
        LocalDate localDate3 = LocalDate.now(Clock.system(ZoneId.of("Indian/Cocos")));
        System.out.println("LocalDate.now(Clock.system(ZoneId.of("Indian/Cocos"))):" + localDate3);
        // 从年,月和日获得LocalDate的实例。
        LocalDate localDate2 = LocalDate.of(1991, Month.MARCH, 24);
        System.out.println("LocalDate.of(1991, Month.MARCH, 24):" + localDate2);
        // 从年,月和日获得LocalDate的实例。
        LocalDate localDate5 = LocalDate.of(1991, 12, 24);
        System.out.println("LocalDate.of(1991, 12, 24):" + localDate5);
    }

输出:

LocalDate.now():2019-07-28
LocalDate.now(Clock.systemDefaultZone()):2019-07-28
LocalDate.now(Clock.system(ZoneId.of("Indian/Cocos"))):2019-07-28
LocalDate.of(1991, Month.MARCH, 24):1991-03-24
LocalDate.of(1991, 12, 24):1991-12-24

3.1.2、从LocalDate获取年,月,日

LocalDate类提供以下API以分别获得年,月和日。

  • Month getMonth() - 使用Month枚举获取月份字段。
  • int getMonthValue() - 获取1到12之间的月份字段。
  • int getYear() - 获取年份字段。
  • int getDayOfMonth() - 获取日期字段。
  • DayOfWeek getDayOfWeek() - 获取星期几字段,即枚举DayOfWeek。
  • int getDayOfYear() - 获取日期字段。
/**
     * 从LocalDate获取年,月,日
     */
    public static void getYearMonthDay() {
        LocalDate localDate = LocalDate.now();
        System.out.println("Year : " + localDate.getYear());
        System.out.println("Month : " + localDate.getMonth().getValue());
        System.out.println("Day of Month : " + localDate.getDayOfMonth());
        System.out.println("Day of Week : " + localDate.getDayOfWeek());
        System.out.println("Day of Year : " + localDate.getDayOfYear());
    }

输出:

Year : 2019
Month : 7
Day of Month : 28
Day of Week : SUNDAY
Day of Year : 209

3.1.3、向LocalDate添加或减去天,月,周和年

LocalDate类提供以下API以向LocalDate添加或减去Days,Months,Weeks和Years。

  • LocalDate plusDays(long daysToAdd) - 返回此LocalDate的副本,并添加指定的天数。
  • LocalDate plusMonths(long monthsToAdd) - 返回此LocalDate的副本,并添加指定的月数。
  • LocalDate plusWeeks(long weeksToAdd) - 返回此LocalDate的副本,并添加指定的周数。
  • LocalDate plusYears(long yearsToAdd) - 返回此LocalDate的副本,并添加指定的年数。
 /**
     * 向LocalDate添加或减去天,月,周和年
     */
    public static void addOrSubstractUsingLocalDate() {
        LocalDate localDate = LocalDate.now();
        // LocalDate 添加指定年月日的方法
        System.out.println("添加 days : " + localDate.plusDays(5));
        System.out.println("添加 months : " + localDate.plusMonths(15));
        System.out.println("添加 weeks : " + localDate.plusWeeks(45));
        System.out.println("添加 years : " + localDate.plusYears(5));

        // LocalDate 减去指定年月日的方法
        System.out.println("减去 days : " + localDate.minusDays(5));
        System.out.println("减去 months : " + localDate.minusMonths(15));
        System.out.println("减去 weeks : " + localDate.minusWeeks(45));
        System.out.println("减去 years : " + localDate.minusYears(5));
    }

输出:

添加 days : 2019-08-02
添加 months : 2020-10-28
添加 weeks : 2020-06-07
添加 years : 2024-07-28
减去 days : 2019-07-23
减去 months : 2018-04-28
减去 weeks : 2018-09-16
减去 years : 2014-07-28

3.1.4、比较LocalDate对象

LocalDate类提供以下API来比较Java中的LocalDate对象。

  • boolean isAfter(ChronoLocalDate other) - 检查此日期是否在指定日期之后。
  • boolean isBefore(ChronoLocalDate other) - 检查此日期是否在指定日期之前。
  • boolean isEqual(ChronoLocalDate other) - 检查此日期是否等于指定日期。
 /**
     * 比较LocalDate对象
     */
    public static void compareLocalDate() {
        LocalDate localDate1 = LocalDate.now();
        LocalDate localDate2 = LocalDate.of(2017, Month.MAY, 14);
        LocalDate localDate3 = LocalDate.of(2016, Month.MAY, 15);

        // isEqual()
        if (localDate1.isEqual(localDate2)) {
            System.out.println("localDate1 等于 localDate2");
        } else {
            System.out.println("localDate1 不等于 localDate2");
        }

        // ifAfter()
        if (localDate2.isAfter(localDate3)) {
            System.out.println("localDate2 大于 localDate3");
        }

        // isBefore()
        if (localDate3.isBefore(localDate1)) {
            System.out.println("localDate3 小于 localDate1");
        }
    }

输出:

localDate1 不等于 localDate2
localDate2 大于 localDate3
localDate3 小于 localDate1

3.1.5、从LocalDate获取月或年的天数

LocalDate类提供以下API,以从LocalDate获取Month或Year的天数。

  • int lengthOfMonth() - 返回此日期表示的月份长度。
  • int lengthOfYear() - 返回此日期表示的年份长度。
/**
     * 从LocalDate获取月或年的天数
     */
    public static void getDaysFromMonthAndYear() {
        LocalDate localDate1 = LocalDate.of(2017, Month.JANUARY, 1);
        LocalDate localDate2 = LocalDate.of(2016, Month.FEBRUARY, 1);

        // Number of days in a month
        System.out.println(localDate1.getMonth() + " 月天数 : " + localDate1.lengthOfMonth());
        System.out.println(localDate2.getMonth() + " 月天数 : " + localDate2.lengthOfMonth());

        // Number of days in a year
        System.out.println(localDate1.getYear() + " 年天数 : " + localDate1.lengthOfYear());
        System.out.println(localDate2.getYear() + " 年天数 : " + localDate2.lengthOfYear());
    }

输出:

JANUARY天数 : 31
FEBRUARY天数 : 29
2017天数 : 365
2016天数 : 366

3.1.6、检查给定年份是否为闰年

LocalDate类提供以下API来检查给定年份是否为闰年。

  • boolean isLeapYear() - 根据ISO日历系统规则,检查年份是否为闰年。
/**
     * 检查给定年份是否为闰年
     */
    public static void checkIfYearIsLeapYear() {
        LocalDate localDate1 = LocalDate.of(2017, Month.JANUARY, 1);
        LocalDate localDate2 = LocalDate.of(2016, Month.JANUARY, 1);

        if (localDate1.isLeapYear()) {
            System.out.println(localDate1.getYear() + " 是闰年");
        } else {
            System.out.println(localDate1.getYear() + " 不是闰年");
        }

        if (localDate2.isLeapYear()) {
            System.out.println(localDate2.getYear() + " 是闰年");
        } else {
            System.out.println(localDate2.getYear() + " 不是闰年");
        }
    }

输出:

2017 不是闰年
2016 是闰年

3.1.7、将String转换为LocalDate的API

LocalDate类提供以下API以在Java中将String转换为LocalDate。

  • static LocalDate parse(CharSequence text) - 从文本字符串(如2007-12-03)获取LocalDate的实例。
  • static LocalDate parse(CharSequence text, DateTimeFormatter formatter) - 使用特定格式化程序从文本字符串中获取LocalDate的实例。
 /**
     * 将String转换为LocalDate的API
     */
    public static void convertStringToLocalDate() {
        // ISO Date
        LocalDate localDate = LocalDate.parse("2017-05-03", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println("localDate:" + localDate);

        // yyyy/MM/dd pattern
        LocalDate localDate1 = LocalDate.parse("2017/05/12", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        System.out.println("2017/05/12 格式化:" + localDate1);

        // dd-LL-yyyy pattern
        LocalDate localDate4 = LocalDate.parse("12-01-2017", DateTimeFormatter.ofPattern("dd-LL-yyyy"));
        System.out.println("12-01-2017 格式化:" + localDate4);
    }

输出:

localDate:2017-05-03
2017/05/12 格式化:2017-05-12
12-01-2017 格式化:2017-01-12

3.1.8、将LocalDate转换为java中的String

LocalDate类提供以下API以在Java中将LocalDate转换为String。

  • String format(DateTimeFormatter formatter) - 使用指定的格式化程序格式化此日期。
 /**
     * LocalDate 转换为指定日期格式字符串
     */
    public static void convertLocalDatetoString() {
        // ISO Date
        LocalDate localDate = LocalDate.now();
        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
        System.out.println(localDate.format(dateFormatter));

        // yyyy/MM/dd pattern
        DateTimeFormatter dateFormatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        System.out.println(localDate.format(dateFormatter1));

        // MMMM dd, yyyy pattern
        DateTimeFormatter dateFormatter2 = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
        System.out.println(localDate.format(dateFormatter2));

        // dd-MMM-yyyy pattern
        DateTimeFormatter dateFormatter3 = DateTimeFormatter.ofPattern("dd-MMM-yyyy");
        System.out.println(localDate.format(dateFormatter3));

        // dd-LL-yyyy pattern
        DateTimeFormatter dateFormatter4 = DateTimeFormatter.ofPattern("dd-LL-yyyy");
        System.out.println(localDate.format(dateFormatter4));
    }

输出:

2019-08-02
2019/08/02
八月 02, 2019
02-八月-2019
02-08-2019

3.2、java.time.LocalTime

LocalTime是一个不可变的类,它的实例代表一个符合人类可读格式的时间,默认格式是hh:mm:ss.zzz。像LocalDate一样,该类也提供了时区支持,同时也可以传入小时、分钟和秒等输入参数创建实例。

3.2.1、LocalTime 对象创建

LocalTime类分别为当前时间和特定时间对象提供以下API。

  • static LocalTime now() - 从默认时区的系统时钟获取当前时间。
  • static LocalTime now(Clock clock) - 从指定的时钟获得当前时间。
  • static LocalTime now(ZoneId zone) - 从指定时区的系统时钟获取当前时间。
private static void createLocalTime() {
        // 当前时间
        LocalTime localTime = LocalTime.now();
        System.out.println("当前时间:"+localTime);

        // 指定时间
        LocalTime localTime2 = LocalTime.of(4, 30, 45);
        System.out.println("指定时间:"+localTime2);

        //当前时钟默认时区
        LocalTime localTime3 = LocalTime.now(Clock.systemDefaultZone());
        System.out.println("当前时钟默认时区:"+localTime3);
        //指定时区
        LocalTime localTime4 = LocalTime.now(Clock.system(ZoneId.of("Asia/Shanghai")));
        System.out.println("指定时区:"+localTime4);
    }

输出:

当前时间:14:28:22.976
指定时间:04:30:45
当前时钟默认时区:14:28:22.976
指定时区:14:28:22.976

3.2.2、从LocalTime获取Hour,Minute,Second 方法

LocalTime类提供以下API从LocalTime获取Hour,Minute,Second。

  • int getHour() - 获取小时( hour-of-day)
  • int getMinute() - 获取分钟(minute-of-hour)
  • int getNano() - 获取纳秒(nano-of-second)
  • int getSecond() - 获取秒(second-of-minute )
/**
     * LocalTime 获取时分秒方法
     */
    public static void getHourMinuteSecondfromLocalTime() {
        LocalTime localTime = LocalTime.now();
        System.out.println("获取 hour-of-day : " + localTime.getHour());
        System.out.println("获取 minute-of-hour : " + localTime.getMinute());
        System.out.println("获取 second-of-minute : " + localTime.getSecond());
        System.out.println("获取nano-of-second : " + localTime.getNano());
    }

输出:

获取 hour-of-day : 14
获取 minute-of-hour : 34
获取 second-of-minute : 30
获取nano-of-second : 73000000

3.2.3、向LocalTime添加或减去小时,分钟和秒 方法

LocalTime类提供以下API以向LocalTime添加或减去小时,分钟和秒。

  • LocalTime plusHours(long hoursToAdd) - 返回此LocalTime的副本,并添加指定的小时数。
  • LocalTime plusMinutes(long minutesToAdd) - 返回此LocalTime的副本,并添加指定的分钟数。
  • LocalTime plusNanos(long nanosToAdd) - 返回此LocalTime的副本,并添加指定的纳秒数。
  • LocalTime plusSeconds(long secondstoAdd) - 返回此LocalTime的副本,并添加指定的秒数。
  • LocalTime minusHours(long hoursToSubtract) - 返回此LocalTime的副本,并减去指定的小时数。
  • LocalTime minusMinutes(long minutesToSubtract) - 返回此LocalTime的副本,并减去指定的分钟数。
  • LocalTime minusNanos(long nanosToSubtract) - 返回此LocalTime的副本,并减去指定的纳秒数。
  • LocalTime minusSeconds(long secondsToSubtract) -返回此LocalTime的副本,并减去指定的秒数。
/**
     * LocalTime 向LocalTime添加或减去小时,分钟和秒
     */
    public static void addorSubtractHoursMinutesAndSecondstoLocalTime() {
        LocalTime localTime = LocalTime.now();
        System.out.println("当前时间 : " + localTime);

        // LocalTime 加法运算
        System.out.println("加上指定小时 : " + localTime.plusHours(2));
        System.out.println("加上指定分钟 : " + localTime.plusMinutes(30));
        System.out.println("加上指定秒数 : " + localTime.plusSeconds(20));
        System.out.println("加上指定纳秒 : " + localTime.plusNanos(60000));

        // LocalTime 减法运算
        System.out.println("减去指定小时 : " + localTime.minusHours(2));
        System.out.println("减去指定分钟 : " + localTime.minusMinutes(30));
        System.out.println("减去指定秒数 : " + localTime.minusSeconds(20));
        System.out.println("减去指定纳秒 : " + localTime.minusNanos(60000));
    }

输出:

当前时间 : 14:44:08.708
加上指定小时 : 16:44:08.708
加上指定分钟 : 15:14:08.708
加上指定秒数 : 14:44:28.708
加上指定纳秒 : 14:44:08.708060
减去指定小时 : 12:44:08.708
减去指定分钟 : 14:14:08.708
减去指定秒数 : 14:43:48.708
减去指定纳秒 : 14:44:08.707940

3.2.4、比较Java中的LocalTime对象的方法

LocalTime类提供以下API来比较Java中的LocalTime对象。

  • int compareTo(LocalTime other) - 比较这个时间到另一个时间。
  • boolean isAfter(LocalTime other) - 检查此时间是否在指定时间之后。
  • boolean isBefore(LocalTime other) - 检查此时间是否在指定时间之前。
/**
     * 比较Java中的LocalTime对象的方法
     */
    public static void compareLocalTimeObjects() {
        LocalTime localTime1 = LocalTime.of(9, 10, 50);
        LocalTime localTime2 = LocalTime.of(9, 10, 50);
        LocalTime localTime3 = LocalTime.of(11, 45, 20);

        // compareTo()
        if (localTime1.compareTo(localTime2) == 0) {
            System.out.println("localTime1 和 localTime2 相等");
        } else {
            System.out.println("localTime1 和 localTime2 不相等");
        }

        // isBefore()
        if (localTime2.isBefore(localTime3)) {
            System.out.println("localTime2 小于 localTime3");
        }

        // isAfter()
        if (localTime3.isAfter(localTime1)) {
            System.out.println("localTime3 大于 localTime1");
        }
    }

输出:

localTime1 和 localTime2 相等
localTime2 小于 localTime3
localTime3 大于 localTime1

3.2.5、将String转换为LocalTime的方法

LocalTime类提供以下API以在java中将String转换为LocalTime。

  • static LocalTime parse(CharSequence text) - 从例如10:15的文本字符串中获取LocalTime的实例。
  • static LocalTime parse(CharSequence text, DateTimeFormatter formatter) - 使用特定格式化程序从文本字符串中获取LocalTime的实例。
 /**
     * 将String转换为LocalTime的方法
     */
    public static void convertStringToLocalTime() {
        LocalTime isoTime = LocalTime.parse("10:15:30", DateTimeFormatter.ISO_LOCAL_TIME);
        System.out.println("isoTime:" + isoTime);

        // hour-of-day (0-23)
        LocalTime localTime = LocalTime.parse("22:45:30", DateTimeFormatter.ofPattern("HH:mm:ss"));
        System.out.println("hour-of-day (0-23):" + localTime);

        // clock-hour-of-am-pm (1-24)
        LocalTime localTime2 = LocalTime.parse("22:45:30", DateTimeFormatter.ofPattern("kk:mm:ss"));
        System.out.println("clock-hour-of-am-pm (1-24):" + localTime2);
    }

输出:

isoTime:10:15:30
hour-of-day (0-23):22:45:30
clock-hour-of-am-pm (1-24):22:45:30

3.2.6、将LocalTime转换为String的方法

LocalTime类提供以下API以在java中将LocalTime转换为String。

  • String format(DateTimeFormatter formatter) - 这次使用指定的格式化程序格式化。
/**
     * 将LocalTime转换为String的方法
     */
    public static void convertLocalTimeToString() {
        LocalTime localTime = LocalTime.now();

        // ISO Format
        DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_TIME;
        System.out.println("ISO Format:" + localTime.format(timeFormatter));

        // hour-of-day (0-23)
        DateTimeFormatter timeFormatter1 = DateTimeFormatter
                .ofPattern("HH:mm:ss");
        System.out.println("hour-of-day (0-23):" + localTime.format(timeFormatter1));

        // clock-hour-of-am-pm (1-24)
        DateTimeFormatter timeFormatter2 = DateTimeFormatter
                .ofPattern("kk:mm:ss");
        System.out.println("clock-hour-of-am-pm (1-24):" + localTime.format(timeFormatter2));

        // clock-hour-of-am-pm (1-12)
        DateTimeFormatter timeFormatter3 = DateTimeFormatter
                .ofPattern("hh:mm:ss a");
        System.out.println("clock-hour-of-am-pm (1-12):" + localTime.format(timeFormatter3));

        // hour-of-am-pm (0-11)
        DateTimeFormatter timeFormatter4 = DateTimeFormatter
                .ofPattern("KK:mm:ss a");
        System.out.println("hour-of-am-pm (0-11):" + localTime.format(timeFormatter4));
    }

输出:

ISO Format:14:59:54.337
hour-of-day (0-23):14:59:54
clock-hour-of-am-pm (1-24):14:59:54
clock-hour-of-am-pm (1-12):02:59:54 下午
hour-of-am-pm (0-11):02:59:54 下午

3.3、LocalDateTime

LocalDateTime 是一个不可变的日期-时间对象,它用于表示日期和时间的组合,默认格式是yyyy-MM-dd-HH-mm-ss.zzz。它提供了一个工厂方法,接收LocalDate和LocalTime输入参数,创建LocalDateTime实例。

3.3.1、从LocalDateTime获取当前日期时间和特定日期时间对象

  • static LocalDateTime now() - 从默认时区中的系统时钟获取当前日期时间。
  • static LocalDateTime now(Clock clock) -从指定的时钟获得当前日期时间。
  • static LocalDateTime now(ZoneId zone) - 从指定时区的系统时钟获取当前日期时间。
 /**
     * 创建 LocalDateTime 对象
     */
    public static void createLocalDateTime() {
        // 获取当前的日期时间对象
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);

        // 从指定时区获取当前的日期时间对象
        LocalDateTime dateTime2 = LocalDateTime.now(ZoneId.of("UTC"));
        System.out.println(dateTime2);

        // 从指定时钟获取当前的日期时间对象
        LocalDateTime dateTime3 = LocalDateTime.now(Clock.systemUTC());
        System.out.println(dateTime3);

        // 获取指定的日期时间对象
        LocalDateTime dateTime4 = LocalDateTime.of(2017, Month.JULY, 12, 10, 35, 55);
        System.out.println(dateTime4);
    }

输出:

2019-08-02T13:15:56.786
2019-08-02T05:15:56.787
2019-08-02T05:15:56.787
2017-07-12T10:35:55

3.3.2、从LocalDateTime获取年,月,日

  • int getYear() - 获取年
  • Month getMonth() - 使用Month枚举获取月份字段。
  • int getDayOfMonth() - 获取 day-of-month
  • DayOfWeek getDayOfWeek() - 获取星期几字段,即枚举DayOfWeek。
  • int getDayOfYear() - 获取 day-of-year
 /**
     * 从LocalDateTime获取年,月,日
     */
    public static void getYearMonthDayFromLocalDateTime() {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("Year : " + dateTime.getYear());
        System.out.println("Month : " + dateTime.getMonth().getValue());
        System.out.println("Day of Month : " + dateTime.getDayOfMonth());
        System.out.println("Day of Week : " + dateTime.getDayOfWeek());
        System.out.println("Day of Year : " + dateTime.getDayOfYear());
    }

输出:

Year : 2019
Month : 8
Day of Month : 2
Day of Week : FRIDAY
Day of Year : 214

3.3.3、从LocalDateTime获取Hour,Minute,Second

  • int getHour() - 获取小时,hour-of-day
  • int getMinute() - 获取分钟,minute-of-hour
  • int getNano() - 获取纳秒,nano-of-second
  • int getSecond() - 获取秒,second-of-minute
 /**
     * 从LocalDateTime获取Hour,Minute,Second
     */
    public static void getHourMinuteSecondfromLocalDateTime() {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("Hour(小时) : " + dateTime.getHour());
        System.out.println("Minute (分钟): " + dateTime.getMinute());
        System.out.println("Second (秒): " + dateTime.getSecond());
        System.out.println("Nano : (纳秒)" + dateTime.getNano());
    }

输出:

Hour(小时) : 13
Minute (分钟): 24
Second (秒): 19
Nano : (纳秒)326000000

3.3.4、用LocalDateTime添加或减去年,月,日,小时,分钟和秒

  • LocalDateTime plusDays(long days) - 返回此LocalDateTime的副本,并添加指定的天数。
  • LocalDateTime plusHours(long hours) - 返回此LocalDateTime的副本,并添加指定的小时数。
  • LocalDateTime plusMinutes(long minutes) - 返回此LocalDateTime的副本,并添加指定的分钟数。
  • LocalDateTime plusMonths(long months) - 返回此LocalDateTime的副本,并添加指定的月数。
  • LocalDateTime plusNanos(long nanos) - 返回此LocalDateTime的副本,其中添加了指定的纳秒数。
  • LocalDateTime plusSeconds(long seconds) - 返回此LocalDateTime的副本,并添加指定的秒数。
  • LocalDateTime plusWeeks(long weeks) - 返回此LocalDateTime的副本,并添加指定的周数。
  • LocalDateTime plusYears(long years) - 返回此LocalDateTime的副本,其中添加了指定的年数。
  • LocalDateTime minusDays(long days) - 返回此LocalDateTime的副本,并减去指定的天数。
  • LocalDateTime minusHours(long hours) - 返回此LocalDateTime的副本,并减去指定的小时数。
  • LocalDateTime minusMinutes(long minutes) - 返回此LocalDateTime的副本,并减去指定的分钟数。
  • LocalDateTime minusMonths(long months) - 返回此LocalDateTime的副本,并减去指定的月数。
  • LocalDateTime minusNanos(long nanos) - 返回此LocalDateTime的副本,减去指定的纳秒数。
  • LocalDateTime minusSeconds(long seconds) - 返回此LocalDateTime的副本,并减去指定的秒数。
  • LocalDateTime minusWeeks(long weeks) - 返回此LocalDateTime的副本,并减去指定的周数。
  • LocalDateTime minusYears(long years) - 返回此LocalDateTime的副本,并减去指定的年数。
/**
     * 用LocalDateTime添加或减去年,月,日,小时,分钟和秒
     */
    public static void addOrSubstractUsingLocalDateTime() {
        LocalDateTime dateTime = LocalDateTime.now();
        // LocalDateTime 加法运算
        System.out.println("加指定天数 : " + dateTime.plusDays(5));
        System.out.println("加指定月数 : " + dateTime.plusMonths(15));
        System.out.println("加指定年数 : " + dateTime.plusYears(5));
        System.out.println("加上指定小时数: " + dateTime.plusHours(2));
        System.out.println("加上指定分钟数 : " + dateTime.plusMinutes(30));
        System.out.println("加上指定秒杀 : " + dateTime.plusSeconds(20));

        // LocalDateTime 减法运算
        System.out.println("减去指定天数 : " + dateTime.minusDays(5));
        System.out.println("减去指定月数 : " + dateTime.minusMonths(15));
        System.out.println("减去指定年数 : " + dateTime.minusYears(5));
        System.out.println("减去指定小时数 : " + dateTime.minusHours(2));
        System.out.println("减去指定分钟数 : " + dateTime.minusMinutes(30));
        System.out.println("减去指定秒数 : " + dateTime.minusSeconds(20));
    }

输出:

加指定天数 : 2019-08-07T13:32:40.395
加指定月数 : 2020-11-02T13:32:40.395
加指定年数 : 2024-08-02T13:32:40.395
加上指定小时数: 2019-08-02T15:32:40.395
加上指定分钟数 : 2019-08-02T14:02:40.395
加上指定秒杀 : 2019-08-02T13:33:00.395
减去指定天数 : 2019-07-28T13:32:40.395
减去指定月数 : 2018-05-02T13:32:40.395
减去指定年数 : 2014-08-02T13:32:40.395
减去指定小时数 : 2019-08-02T11:32:40.395
减去指定分钟数 : 2019-08-02T13:02:40.395
减去指定秒数 : 2019-08-02T13:32:20.395

3.3.5、比较Java中的LocalDateTime对象

  • boolean isAfter(ChronoLocalDateTime<?> other) - 检查此日期时间是否大于指定的日期时间。
  • boolean isBefore(ChronoLocalDateTime<?> other) - 检查此日期时间是否小于指定的日期时间。
  • boolean isEqual(ChronoLocalDateTime<?> other) - 检查此日期时间是否等于指定的日期时间。
  • int compareTo(ChronoLocalDateTime<?> other) - 将此日期时间与另一个日期时间进行比较。
 /**
     * 比较Java中的LocalDateTime对象
     */
    public static void compareLocalDateTimeObjects() {
        LocalDateTime dateTime1 = LocalDateTime.of(2019, 07, 22, 10, 55, 25);
        LocalDateTime dateTime2 = LocalDateTime.of(2018, 04, 11, 05, 35, 26);
        LocalDateTime dateTime3 = LocalDateTime.of(2017, 12, 22, 10, 55, 25);

        // isBefore()
        if (dateTime1.isBefore(dateTime2)) {
            System.out.println("dateTime1 小于 dateTime2");
        }

        // isAfter()
        if (dateTime2.isAfter(dateTime3)) {
            System.out.println("dateTime2 大于 dateTime3");
        }

        // isEqual()
        if (dateTime1.isEqual(dateTime3)) {
            System.out.println("dateTime1 等于 dateTime3");
        }

        // compareTo()
        if (dateTime1.compareTo(dateTime3) == 0) {
            System.out.println("dateTime1 等于 dateTime3");
        }

    }

输出:

dateTime2 大于 dateTime3

3.3.6、从LocalDateTime转换为LocalDate

  • LocalDate toLocalDate() - 获取此日期时间的LocalDate部分。
 /**
     * 从LocalDateTime转换为LocalDate
     * */
    public static void convertLocalDateTimeToLocalDate() {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("当前时间:"+dateTime);

        LocalDate localDate = dateTime.toLocalDate();
        System.out.println("获取日期部分:"+localDate);
    }

输出:

当前时间:2019-08-02T13:40:53.887
获取日期部分:2019-08-02

3.3.7、从LocalDateTime转换为LocalTime

  • LocalTime toLocalTime() - 获取此日期时间的LocalTime部分。
/**
     * 从LocalDateTime转换为LocalTime
     */
    public static void convertLocalDateTimeToLocalTime() {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("当前日期时间:" + dateTime);

        LocalTime localDate = dateTime.toLocalTime();
        System.out.println("当前时间部分:" + localDate);
    }

输出:

当前日期时间:2019-08-02T13:42:41.219
当前时间部分:13:42:41.219

4、用于表示时间戳(timestamp )和持续时间(duration)的新类

4.1、Instant

nstant类是用在机器可读的时间格式上的,它以Unix时间戳的形式存储日期时间

 public static void instantMethod() {
        Instant instant = Instant.parse("2019-08-02T10:37:30.00Z");
        Instant minmus2Days=  instant.minus(Duration.ofDays(2));
        Instant pulus5Days=  instant.plus(Duration.ofDays(5));

        System.out.println("Instant 对象实例:"+instant);
        System.out.println("Instant 减去2天:"+minmus2Days);
        System.out.println("Instant 加上5天:"+pulus5Days);
        System.out.println("Instant 是否支持单位DAYS:"+instant.isSupported(ChronoUnit.DAYS));
        System.out.println("Instant 是否支持单位YEARS:"+instant.isSupported(ChronoUnit.YEARS));
    }

输出:

Instant 对象实例:2019-08-02T10:37:30Z
Instant 减去2天:2019-07-31T10:37:30Z
Instant 加上5天:2019-08-07T10:37:30Z
Instant 是否支持单位DAYS:true
Instant 是否支持单位YEARS:false

4.2、Duration

Duration 最适合测量基于机器的时间的情况,例如使用Instant对象的代码。

Duration 对象以秒或纳秒为单位测量,并且不使用基于日期的构造,例如年,月和日,尽管该类提供了转换为天,小时和分钟的方法。

Duration 提供了很多API/方法来处理持续时间。我们将讨论一些重要且经常使用的API 方法。

 public static void durationMethod() {
        Duration d1 = Duration.between(LocalTime.MAX, LocalTime.NOON);
        Duration d2 = Duration.between(LocalTime.NOON, LocalTime.MAX);
        System.out.println("d1 是否是负数:" + d1.isNegative());
        System.out.println("d2 是否是负数:" + d2.isNegative());
        System.out.println("d1 与 d2 相差秒数:" + d1.get(ChronoUnit.SECONDS));
        System.out.println("d1 加上 d2 :" + d1.plus(d2).getSeconds());
        System.out.println("d1 减去 d2 :" + d1.minus(d2).getSeconds());
    }

输出:

d1 是否是负数:true
d2 是否是负数:false
d1 与 d2 相差秒数:-43200
d1 加上 d2 :0
d1 减去 d2 :-86400

4.3、Period

Period 类表示以年,月和日为单位的时间量。 这个类是不可变的和线程安全的。

public class PeriodDemo {
    public static void periodMethod() {
        withYearsMethodExample();

        withMonthsMethodExample();

        withDaysMethodExample();

        toTotalMonthsMethodExample();

        subtractFromMethodExample();

        plusYearsMethodExample();

        plusMonthsMethodExample();

        plusDaysMethodExample();

        plusMethodExample();

        parseMethodExample();

        ofYearsMethodExample();

        ofWeeksMethodExample();

        ofMonthsMethodExample();

        ofDaysMethodExample();

        ofMethodExample();

        minusYearsMethodExample();

        minusMonthsMethodExample();

        minusDaysMethodExample();
    }

    public static void withYearsMethodExample() {
        Period period = Period.ofYears(2);
        System.out.println("Period.ofYears(2):" + period.toString());
        period = period.withYears(5);
        System.out.println("period.withYears(5):" + period.toString());
    }

    public static void withMonthsMethodExample() {
        Period period = Period.ofMonths(2);
        System.out.println("Period.ofMonths(2):" + period.toString());
        period = period.withMonths(5);
        System.out.println("period.withMonths(5):" + period.toString());
    }

    public static void withDaysMethodExample() {
        Period period = Period.ofDays(2);
        System.out.println("Period.ofDays(2):" + period.toString());
        period = period.withDays(5);
        System.out.println("period.withDays(5):" + period.toString());
    }

    public static void toTotalMonthsMethodExample() {
        Period period = Period.ofYears(2);
        System.out.println("Period.ofYears(2):" + period.toTotalMonths());
    }

    public static void subtractFromMethodExample() {
        Period period = Period.ofYears(2);

        LocalDateTime date = LocalDateTime.now();
        System.out.println(date);

        date = (LocalDateTime) period.subtractFrom(date);
        System.out.println(date);
    }

    public static void plusYearsMethodExample() {
        Period period = Period.ofYears(2);
        Period period1 = period.plusYears(1);
        System.out.println("Period.ofYears(2).plusYears(1):" + period1.getYears());
    }

    public static void plusMonthsMethodExample() {
        Period period = Period.ofMonths(2);
        Period period1 = period.plusMonths(1);
        System.out.println("Period.ofMonths(2).plusMonths(1):" + period1.getMonths());
    }

    public static void plusDaysMethodExample() {
        Period period = Period.ofDays(2);
        Period period1 = period.plusDays(1);
        System.out.println("Period.ofDays(2).plusDays(1):" + period1.getDays());
    }

    public static void plusMethodExample() {
        Period period = Period.of(1, 5, 2);
        System.out.println(
                "Years: " + period.getYears() + ", Months: " + period.getMonths() + ", Days: " + period.getDays());
        Period period1 = period.plus(Period.ofDays(5));
        System.out.println(
                "Years: " + period1.getYears() + ", Months: " + period1.getMonths() + ", Days: " + period1.getDays());
    }

    public static void parseMethodExample() {
        Period period = Period.parse("P1Y2M3D");
        System.out.println(
                "Years: " + period.getYears() + ", Months: " + period.getMonths() + ", Days: " + period.getDays());
    }

    public static void ofYearsMethodExample() {
        Period period = Period.ofYears(2);
        System.out.println(period.getYears());
    }

    public static void ofWeeksMethodExample() {
        Period period = Period.ofWeeks(2);
        System.out.println(period.getDays());
    }

    public static void ofMonthsMethodExample() {
        Period period = Period.ofMonths(2);
        System.out.println(period.getMonths());
    }

    public static void ofDaysMethodExample() {
        Period period = Period.ofDays(2);
        System.out.println(period.getDays());
    }

    public static void ofMethodExample() {
        Period period = Period.of(1, 5, 2);
        System.out.println(
                "Years: " + period.getYears() + ", Months: " + period.getMonths() + ", Days: " + period.getDays());
    }

    public static void minusYearsMethodExample() {
        Period period = Period.ofYears(5);
        System.out.println(period.getYears());
        Period period1 = period.minusYears(3);
        System.out.println(period1.getYears());
    }

    public static void minusMonthsMethodExample() {
        Period period = Period.ofMonths(5);
        System.out.println(period.getMonths());
        Period period1 = period.minusMonths(3);
        System.out.println(period1.getMonths());
    }

    public static void minusDaysMethodExample() {
        Period period = Period.ofDays(5);
        System.out.println(period.getDays());
        Period period1 = period.minusDays(3);
        System.out.println(period1.getDays());
    }
}

输出:

Period.ofYears(2):P2Y
period.withYears(5):P5Y
Period.ofMonths(2):P2M
period.withMonths(5):P5M
Period.ofDays(2):P2D
period.withDays(5):P5D
Period.ofYears(2):24
2019-08-02T14:53:10.333
2017-08-02T14:53:10.333
Period.ofYears(2).plusYears(1):3
Period.ofMonths(2).plusMonths(1):3
Period.ofDays(2).plusDays(1):3
Years: 1, Months: 5, Days: 2
Years: 1, Months: 5, Days: 7
Years: 1, Months: 2, Days: 3
2
14
2
2
Years: 1, Months: 5, Days: 2
5
2
5
2
5
2

参考资料:

JSR 310 Date and Time API v1.0

https://docs.oracle.com/javase/tutorial/datetime/overview/index.html

https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

最后

以上就是含蓄秋天为你收集整理的Java 8(七):新的Date 和 Time API的全部内容,希望文章能够帮你解决Java 8(七):新的Date 和 Time API所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部