关于java:Jdk8-新日期工具类-Api-学习笔记

59次阅读

共计 10763 个字符,预计需要花费 27 分钟才能阅读完成。

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.util.Locale;
import java.util.TimeZone;

/**
 * Period / ZoneId / LocalDate / LocalDateTime / Duration / Month / DayOfWeek
 * 均来自 java.util 包
 */
public class TimeDemo {public static void main(String[] args) {

        /*
            1
            ZoneId 代表时区
            ZoneOffset 代表时区偏移量
            ZoneOffset 是 ZoneId 的子类
         */

        // 1.1 获取零碎时区,以下几个办法都是等价的
        ZoneId zoneId_1_1 = ZoneId.systemDefault();
        ZoneId zoneId_1_2 = ZoneOffset.systemDefault();
        ZoneId zoneId_1_3 = TimeZone.getDefault().toZoneId();

        // 1.2 获取 东八区 的 ZoneId,以下几个办法都是等价的
        ZoneId zoneId_2_1 = ZoneId.of("UTC+8");
        ZoneId zoneId_2_2 = ZoneId.of("UTC+08");
        ZoneId zoneId_2_3 = ZoneId.of("UTC+08:00");
        ZoneId zoneId_2_4 = ZoneId.of("Etc/GMT-8");
        ZoneId zoneId_2_5 = ZoneId.of("UT+8");
        ZoneId zoneId_2_6 = ZoneId.of("UT+08");
        ZoneId zoneId_2_7 = ZoneId.of("UT+08:00");
        System.out.println("1.2 ZoneId 7 :" + zoneId_2_7); // 输入 UT+08:00
        ZoneId zoneId_2_8 = ZoneId.of("+8");
        ZoneId zoneId_2_9 = ZoneId.of("+08");
        ZoneId zoneId_2_10 = ZoneId.of("+08:00");
        System.out.println("1.2 ZoneId 10 :" + zoneId_2_10); // 输入 +08:00
        ZoneOffset zoneOffset_2_11 = ZoneOffset.of("+8");
        System.out.println("1.2 ZoneId 11 :" + zoneOffset_2_11); // 输入 +08:00
        ZoneOffset zoneOffset_2_12 = ZoneOffset.ofHours(8);
        System.out.println("1.2 ZoneId 12 :" + zoneOffset_2_12); // 输入 +08:00


        // 1.3 获取固定城市的时区
        ZoneId zoneId_3_1 = ZoneId.of("Asia/Shanghai"); // 上海
        System.out.println("1.3 ZoneId 1 :" + zoneId_3_1); // 输入 Asia/Shanghai
        ZoneId zoneId_3_2 = ZoneId.of("Asia/Chongqing"); // 重庆
        ZoneId zoneId_3_3 = ZoneId.of("Asia/Chungking"); // 重庆
        ZoneId zoneId_3_4 = ZoneId.of("Asia/Hong_Kong"); // 香港

        // 1.4 常量
        ZoneOffset zoneOffsetMax = ZoneOffset.MAX;
        System.out.println("1.4 ZoneId MAX :" + zoneOffsetMax); // 输入 +18:00
        ZoneOffset zoneOffsetMin = ZoneOffset.MIN;
        System.out.println("1.4 ZoneId MIN :" + zoneOffsetMin); // 输入 -18:00
        ZoneOffset zoneOffsetUtc = ZoneOffset.UTC;
        System.out.println("1.4 ZoneId UTC :" + zoneOffsetUtc); // 输入 Z

        // 1.5 ZoneOffset 和 ZoneId 的相互转换
        ZoneOffset zoneOffset_1_5 = ZoneOffset.ofHours(7);
        ZoneId zoneId_1_5 = zoneOffset_1_5.normalized();
        System.out.println("1.5 ZoneId :" + zoneId_1_5); // 输入 +07:00



        /*
            2 Period
            Period 是代表年月日级别的工夫区间
        */

        // 2.1 区间为 0 年,0 月,0 日的常量对象
        Period periodZero = Period.ZERO;
        System.out.println("2.1 Period Zero :" + periodZero); // 输入 P0D

        // 2.2 创立一个 1 年,2 月,3 日的 Period 对象
        Period period_2 = Period.of(1, 2, 3);
        System.out.println("2.2 Period :" + period_2); // 输入 P1Y2M3D

        // 2.3 获取 Period 年数
        long periodYear = period_2.get(ChronoUnit.YEARS);
        System.out.println("2.3 Period Year :" + periodYear); // 输入 1

        // 2.4 获取 Period 月数
        long periodMonth = period_2.get(ChronoUnit.MONTHS);
        System.out.println("2.4 Period Month :" + periodMonth); // 输入 2

        // 2.5 获取 Period 日数
        long periodDay = period_2.get(ChronoUnit.DAYS);
        System.out.println("2.5 Period Day :" + periodDay); // 输入 3


        /*
            3 Duration
            Duration 是代表一段时间的对象
        */

        // 3.1 持续时间为 0 的常量对象
        Duration duration_1 = Duration.ZERO;
        System.out.println("3.1 Duration :" + duration_1); // 输入 PT0S

        // 3.2 持续时间 1 分钟
        Duration duration_2 = Duration.of(1, ChronoUnit.SECONDS);
        System.out.println("3.2 Duration :" + duration_2); // 输入 PT1S

        // 3.3 持续时间 1 天
        Duration duration_3 = ChronoUnit.DAYS.getDuration();
        System.out.println("3.3 Duration :" + duration_3); // 输入 PT24H
        long seconds = duration_3.getSeconds();
        System.out.println("3.3 Duration Second :" + seconds); // 输入 86400

        // 3.4 持续时间 1 年
        Duration duration_4 = ChronoUnit.YEARS.getDuration();
        System.out.println("3.4 Duration :" + duration_4); // 输入 PT8765H49M12S
        long durationSecond = duration_4.getSeconds();
        System.out.println("3.4 Duration Second:" + durationSecond); // 输入 31556952

        // 3.5 工夫区间的叠加
        // 创立一个 1 秒的距离对象,再叠加上一个 1 秒的距离对象,取得一个代表 2 秒距离的对象
        Duration duration_5 = Duration.of(1, ChronoUnit.SECONDS);
        System.out.println("3.5 Duration :" + duration_5); // 输入 PT1S
        Duration durationDouble = duration_5.plus(duration_5);
        System.out.println("3.5 Duration Double :" + durationDouble); // 输入 PT2S

        // 3.6 工夫区间的相除
        // 创立一个 1 分支的距离对象,将其除以 2,取得一个代表 30 秒距离的对象
        Duration duration_6 = Duration.of(1, ChronoUnit.MINUTES);
        Duration durationDivide = duration_6.dividedBy(2);
        System.out.println("3.6 Duration Divide :" + durationDivide); // 输入 PT30S


        /*
            4 LocalDate
            LocalDate 代表日期
        */
        // 4.1 创立 LocalDate 为 2022 年 1 月的第一天
        LocalDate localDate_1 = LocalDate.of(2022, 1, 1);
        System.out.println("4.1 LocalDate :" + localDate_1); // 输入 2022-01-01

        // 4.2 创立 LocalDate 为 2022 年 7 月的第一天
        LocalDate localDate_2 = LocalDate.of(2022, Month.JULY, 1);
        System.out.println("4.2 LocalDate :" + localDate_2); // 输入 2022-07-01

        // 4.3 创立 LocalDate 为 2022 年的第 100 天
        LocalDate localDate_3 = LocalDate.ofYearDay(2022, 100);
        System.out.println("4.3 LocalDate :" + localDate_3); // 输入 2022-04-10

        // 4.4 LocalDate 常量
        LocalDate localDateEpoch = LocalDate.EPOCH;
        System.out.println("4.4 LocalDate EPOCH :" + localDateEpoch); // 输入 1970-01-01
        LocalDate localDateMax = LocalDate.MAX;
        System.out.println("4.4 LocalDate MAX :" + localDateMax); // 输入 +999999999-12-31
        LocalDate localDateMin = LocalDate.MIN;
        System.out.println("4.4 LocalDate MIn :" + localDateMin); // 输入 -999999999-01-01

        // 4.5 epoch day 指的是基于 1970-01-01 过来的日期
        // 此例子中输入的日期是 1970-1-1 + 1000 天 的日子
        LocalDate localDate_5 = LocalDate.ofEpochDay(1000);
        System.out.println("4.5 LocalDate :" + localDate_5); // 输入 1972-09-27

        // 4.6 将字符串解析成 LocalDate
        DateTimeFormatter localDateFormatter_6 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault());
        LocalDate localDate_6 = LocalDate.parse("2022-01-01", localDateFormatter_6);
        System.out.println("4.6 LocalDate :" + localDate_6); // 输入 2022-01-01

        // 4.7 以后零碎工夫
        LocalDate localDate_7 = LocalDate.now();
        System.out.println("4.7 LocalDate :" + localDate_7); // 输入以后零碎工夫

        // 4.8 LocalDate 获取年月日等根本信息
        LocalDate localDate_8 = LocalDate.of(2022, 1, 1);
        System.out.println("4.8 LocalDate :" + localDate_8); // 输入 2022-01-01

        LocalDate localDate_8_1 = LocalDate.from(localDate_2);
        System.out.println("4.8 LocalDate 1 :" + localDate_8_1); // 输入 2022-01-01

        int localDateDayOfYear = localDate_2.get(ChronoField.DAY_OF_YEAR);
        System.out.println("4.8 LocalDate DayOfYear :" + localDateDayOfYear); // 输入 1

        int localDateDayOfYear_2 = localDate_2.getDayOfYear();
        System.out.println("4.8 LocalDate DayOfYear 2 :" + localDateDayOfYear_2); // 输入 1

        int localDateYear = localDate_2.get(ChronoField.YEAR);
        System.out.println("4.8 LocalDate Year :" + localDateYear); // 输入 2022

        int localDateYear_2 = localDate_2.getYear();
        System.out.println("4.8 LocalDate Year 2 :" + localDateYear_2); // 输入 2022

        int localDateDayOfWeek = localDate_2.get(ChronoField.DAY_OF_WEEK);
        System.out.println("4.8 LocalDate DayOfWeek :" + localDateDayOfWeek); // 输入 6

        DayOfWeek localDateDayOfWeek_2 = localDate_2.getDayOfWeek();
        System.out.println("4.8 LocalDate DayOfWeek 2 :" + localDateDayOfWeek_2); // 输入 SATURDAY

        int localDateDayOfWeek_3 = localDateDayOfWeek_2.getValue();
        System.out.println("4.8 LocalDate DayOfWeek 3 :" + localDateDayOfWeek_3); // 输入 6

        // 4.9 LocalDate 转换格局
        LocalDateTime localDateOfTime = LocalDateTime.of(2022, 2, 2, 1, 1, 1);
        // 此处将 localDate_4_2 (LocalDate 类型) 转换成 LocalDateTime 类型
        // 留神,只有低精度能够转换成高精度,高精度是不能够转换成低精度的,会报错
        // 比方:LocalDateTime 类型的精度比 LocalDate 类型高,不能转换,反之能够
        Temporal temporal_9 = localDate_2.adjustInto(localDateOfTime);
        System.out.println("4.9 LocalDate AdjustInto LocalDateTime :" + temporal_9); // 输入 2022-01-01T01:01:01


        /*
            5 LocalDateTime
            LocalDateTime 代表日期和工夫
            LocalDateTime 的 Api 大部分和 LocalDate 相似
        */
        // 5.1 LocalDateTime 创立办法,年月日时分秒
        LocalDateTime localDateTime_1 = LocalDateTime.of(2022, 1, 1, 1, 1, 1);
        System.out.println("5.1 LocalDateTime :" + localDateTime_1); // 输入 2022-01-01T01:01:01

        // 5.2 LocalDateTime 的增减
        // 减少一天
        LocalDateTime localDateTime_2_1 = localDateTime_1.plus(1, ChronoUnit.DAYS);
        System.out.println("5.2 LocalDateTime Plus :" + localDateTime_2_1); // 输入 2022-01-02T01:01:01
        // 缩小一天
        LocalDateTime localDateTime_2_2 = localDateTime_1.minus(1, ChronoUnit.DAYS);
        System.out.println("5.2 LocalDateTime Minus :" + localDateTime_2_2); // 输入 2021-12-31T01:01:01

        // 5.3 LocalDateTime 转 LocalDate 或者 LocalTime
        LocalTime localDateTimeToTime = localDateTime_1.toLocalTime();
        System.out.println("5.3 LocalDateTime ToTime :" + localDateTimeToTime); // 输入 01:01:01
        LocalDate localDateTimeToDate = localDateTime_1.toLocalDate();
        System.out.println("5.3 LocalDateTime ToDate :" + localDateTimeToDate); // 输入 2022-01-01

        // 5.4 以后零碎工夫
        LocalDateTime localDateTime_4 = LocalDateTime.now();
        System.out.println("5.4 LocalDateTime :" + localDateTime_4); // 输入以后零碎工夫

        // 5.5 应用 Instant 来生成一个 LocalDateTime
        Instant now = Instant.now();
        LocalDateTime localDateTime_5 = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
        System.out.println("5.3 LocalDateTime :" + localDateTime_5); // 输入以后零碎工夫

        // 5.6 LocalDateTime 常量
        LocalDateTime localDateTimeMax = LocalDateTime.MAX;
        System.out.println("5.6 LocalDateTime MAX :" + localDateTimeMax); // 输入 +999999999-12-31T23:59:59.999999999
        LocalDateTime localDateTimeMin = LocalDateTime.MIN;
        System.out.println("5.6 LocalDateTime MIn :" + localDateTimeMin); // 输入 -999999999-01-01T00:00

        // 5.7 依据秒和纳秒来创立 LocalDateTime
        LocalDateTime localDateTime_7 = LocalDateTime.ofEpochSecond(10000, 1000, ZoneOffset.of("+8"));
        System.out.println("5.5 LocalDateTime OfEpochSecond :" + localDateTime_7);



        /*
            6 Instant
            Instant 代表一个工夫点
        */
        // 6.1 将一个工夫戳(毫秒级)转换成一个 Instant 对象
        Instant instant_1 = Instant.ofEpochMilli(1000000L);
        System.out.println("6.1 Instant :" + instant_1); // 输入 1970-01-01T00:16:40Z

        // 6.2 Instant 转工夫戳(毫秒)long epochMilli = instant_1.toEpochMilli();
        System.out.println("6.2 Instant EpochMilli :" + epochMilli); // 输入 1000000

        // 6.3 Instant 转工夫戳(秒)long epochSecond = instant_1.getEpochSecond();
        System.out.println("6.3 Instant EpochSecond :" + epochSecond); // 输入 1000

        // 6.4 工夫的比拟
        Instant instant_4 = Instant.ofEpochMilli(10000000000L);
        boolean after = instant_1.isAfter(instant_4);
        System.out.println("6.4 Instant isAfter :" + after); // 输入 false
        boolean before = instant_1.isBefore(instant_4);
        System.out.println("6.4 Instant isBefore :" + before); // 输入 true

        // 6.5 获取纳秒数
        int nano = instant_1.getNano();
        System.out.println("6.4 Instant Nano :" + nano); // 输入 0


        // 6.6 将一个工夫戳(秒级)转换成一个 Instant 对象
        Instant instant_6 = Instant.ofEpochSecond(1000L);
        System.out.println("6.6 Instant :" + instant_6); // 输入 1970-01-01T00:16:40Z

        // 6.7 将一个字符串转换成 Instant 对象
        // 留神,此处的字符串格局是固定的
        Instant instant_7 = Instant.parse("2007-12-03T10:15:30.00Z");
        System.out.println("6.7 Instant :" + instant_7); // 输入 2007-12-03T10:15:30.00Z

        // 6.8 常量
        Instant instant_8_1 = Instant.MAX;
        System.out.println("6.8 Instant MAX :" + instant_8_1); // 输入 +1000000000-12-31T23:59:59.999999999Z
        Instant instant_8_2 = Instant.MIN;
        System.out.println("6.8 Instant MIN :" + instant_8_2); // 输入 -1000000000-01-01T00:00:00Z
        Instant instant_8_3 = Instant.EPOCH;
        System.out.println("6.8 Instant EPOCH :" + instant_8_3); // 输入 1970-01-01T00:00:00Z

        // 6.9 以后零碎工夫
        Instant instant_9 = Instant.now();
        System.out.println("6.9 Instant NOW :" + instant_9); // 输入以后零碎工夫



        /*
            7 Clock
            Clock 是用来获取工夫戳的一个工具类
            绝对于 System.currentTimeMillis() 办法,Clock 能够定制特定的时区,更加灵便
        */

        // 7.1 获取一个以后零碎的工夫实例
        Clock clock_1 = Clock.systemDefaultZone();
        System.out.println("7.1 Clock SystemDefaultZone :" + clock_1); // 输入 SystemClock[Asia/Shanghai]
        // 7.2 获取这个 clock 的时区
        ZoneId clockZone = clock_1.getZone();
        System.out.println("7.2 Clock Zone :" + clockZone); // 输入 Asia/Shanghai
        // 7.3 获取以后工夫戳
        long clockMillis = clock_1.millis();
        System.out.println("7.3 Clock Millis :" + clockMillis); // 输入零碎以后工夫戳
        // 7.4 获取以后工夫的 Instant
        Instant clockInstant = clock_1.instant();
        System.out.println("7.4 Clock Instant :" + clockInstant); // 输入 2022-07-14T03:24:37.103993Z
        // 7.5 这相似一个复制性能,复制一个具体某个时区的 Clock 对象
        Clock utc10Clock = clock_1.withZone(ZoneId.of("UTC+10"));
        System.out.println("7.5 Clock UTC+10 :" + utc10Clock); // 输入 SystemClock[UTC+10:00]
        // 7.6 获取一个 TickClock
        // TickClock 不会返回实时的零碎工夫,每过一个距离的工夫才会挪动一次
        // 此处的 TickClock 每过一秒刷新一次
        Clock tickClock = Clock.tick(Clock.systemDefaultZone(), Duration.of(1, ChronoUnit.SECONDS));


    }    
}

正文完
 0