Java8笔记第十一篇(带时区的时间或日期)

目录:
第一篇:初探 java8 第 01 篇( Lambda与Stream API初识 )
第二篇:深入 java8 第 02 篇( Lambda表达式基础语法 )
第三篇:深入 java8 第 03 篇( 函数式接口,常见的4个函数式接口 )
第四篇:深入 java8 第 04 篇( 方法引用与构造器引用 )
第五篇:深入 java8 第 05 篇( Stream API 的操作->创建及中间操作 )
第六篇:深入 java8 第 06 篇( Stream API 的操作->终止操作 )
第七篇:深入 java8 第 07 篇( Stream API 的操作->规约、收集 )
第八篇:深入 java8 第 08 篇( Stream API 的综合练习 )
第九篇:深入 java8 第 09 篇( Fork/Join 框架的使用及其优势 )
第十篇:深入 java8 第 10 篇( 时间新特新 -> DateTimeFormatter 解析与格式化 )
第十一篇:深入 java8 第 11 篇( 带时区的时间或日期)
第十二篇:深入 java8 第 12 篇(接口中的默认方法与静态方法 )
第十三篇:深入 java8 第 13 篇( 其他新特性 -> Optional 类/重复注解与类型注解 )

深入 java8 第 10 篇( 带时区的时间或日期 )

Java8中的新时间日期API:
LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法!

11.1 LocalDate、LocalTime、LocalDateTime

以三个实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。
@Test
    public void test01(){
        LocalDate date = LocalDate.now();
        System.out.println(date);

        LocalTime time = LocalTime.now();
        System.out.println("\n"+time);

        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("\n"+dateTime);
    }

11.2 测试实例的方法

now() 静态方法,根据当前时间创建对象
of() 静态方法,根据指定日期/时间创建对象
plusDays,plusWeeks,plusMonths,plusYears 向当前 LocalDate 对象添加几天、几周、几个月、几年
minusDays,minusWeeks,minusMonths,minusYears 从当前 LocalDate 对象减去几天、几周、几个月、几年
plus, minus 添加或减少一个 Duration 或 Period
withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天数、年份天数、月份、年份修改为指定 的值 并返回新的LocalDate 对象
getDayOfMonth 获得月份天数(1-31)
getDayOfYear 获得年份天数(1-366)
getDayOfWeek 获得星期几(返回一个 DayOfWeek枚举值)
getMonth 获得月份, 返回一个 Month 枚举值
getMonthValue 获得月份(1-12)
getYear 获得年份
until 获得两个日期之间的 Period 对象,或者指定 ChronoUnits 的数字
isBefore, isAfter 比较两个 LocalDate
isLeapYear 判断是否是闰年
@Test
    public void test02() throws InstantiationException, IllegalAccessException{
        // now
        LocalDate date = LocalDate.now();
        System.out.println(date);

        // of
        LocalDate date2 = LocalDate.of(2018, 04, 29);
        System.out.println("\n"+date2);

        // plusDays,plusWeeks,plusMonths,plusYears
        LocalDateTime time = LocalDateTime.now();
        LocalDateTime time2 = time.plusDays(3);
        LocalDateTime time3 = time2.plusWeeks(3);
        LocalDateTime time4 = time3.plusMonths(3);
        LocalDateTime time5 = time4.plusYears(3);
        System.out.println("\n"+time);
        System.out.println(time2);
        System.out.println(time3);
        System.out.println(time4);
        System.out.println(time5);

        // plus, minus
        LocalDate date3 = LocalDate.now();
        LocalDate plus = date3.plus(Period.of(01, 04, 0));
        LocalDate minus = date3.minus(Duration.ZERO);
        System.out.println("\n"+plus);
        System.out.println(minus);

        // withDayOfMonth,withDayOfYear,withMonth,withYear
        LocalDate date4 = LocalDate.now();
        LocalDate dayOfMonth = date4.withDayOfMonth(11);
        LocalDate dayOfYear = date4.withDayOfYear(20);
        LocalDate month = date4.withMonth(3);
        LocalDate year = date4.withYear(2019);
        System.out.println("\n"+dayOfMonth);
        System.out.println(dayOfYear);
        System.out.println(month);
        System.out.println(year);

        // getDayOfMonth,getDayOfYear,getDayOfWeek,getMonth,getMonthValue,getYear
        LocalDate date5 = LocalDate.now();
        int dayOfMonth2 = date5.getDayOfMonth();
        int dayOfYear2 = date5.getDayOfYear();
        DayOfWeek dayOfWeek = date5.getDayOfWeek();
        Month month2 = date5.getMonth();
        int monthValue = date5.getMonthValue();
        int year2 = date5.getYear();
        System.out.println("\n"+dayOfMonth2);
        System.out.println(dayOfYear2);
        System.out.println(dayOfWeek);
        System.out.println(month2);
        System.out.println(monthValue);
        System.out.println(year2);

        // until
        LocalDate date6 = LocalDate.now();
        Period until = date6.until(LocalDate.now());
        System.out.println("\n"+until);

        // isBefore, isAfter
        LocalDate date7 = LocalDate.now();
        LocalDate date8 = LocalDate.of(2019, 05, 22);
        boolean before = date7.isBefore(date8);
        boolean after = date7.isAfter(date8);
        System.out.println("\n"+before);
        System.out.println(after);

        // isLeapYear
        LocalDate date9 = LocalDate.now();
        boolean year3 = date9.isLeapYear();
        System.out.println("\n"+year3);
    }

11.3 Instant 时间戳

Instant主要用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算。

@Test
    public void test03(){
        Instant instant = Instant.now();
        System.out.println(instant);

        // 将此瞬间与偏移组合起来创建一个 OffsetDateTime
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println("\n"+offsetDateTime);

        // 从第二个开始就从时间线获得纳秒的数量。
        int nano = instant.getNano();
        System.out.println("\n"+nano);

        // 使用从1970-01-01T00:0000Z的时代开始的秒数获得一个 Instant的实例
        Instant epochSecond = Instant.ofEpochSecond(3);
        System.out.println("\n"+epochSecond);

        // 获得的一个实例 Instant从1970-01-01T00划时代使用毫秒:0000Z
        Instant epochMilli = Instant.ofEpochMilli(3);
        System.out.println("\n"+epochMilli);
    }

11.4 Duration 和 Period

Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
@Test
    public void test04(){
        Instant now = Instant.now();
        // 模拟实际生产环境延迟加载
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Instant now2 = Instant.now();
        // 获取一个 Duration表示两个时间对象之间的持续时间
        Duration duration = Duration.between(now, now2);
        System.out.println(duration.getSeconds());

        LocalDate localDate = LocalDate.now();
        LocalDate localDate2 = LocalDate.of(2008, 11, 27);
        //获得一个 Period ,由两个日期之间的年数,月份和日期组成
        Period period = Period.between(localDate2, localDate);
        System.out.println("\n"+period.getYears()); // 获得这段时间的年数
        System.out.println(period.getMonths()); // 获取此期间的月数。
        System.out.println(period.getDays()); // 获得此期间的天数。
    }

11.5 TemporalAdjuster : 时间校正器

有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
@Test
    public void test05(){
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);

        // 将月份修改为指定的值
        LocalDateTime dayOfMonth = localDateTime.withDayOfYear(3);
        System.out.println("\n"+dayOfMonth);

        // 返回下一个星期的调整器,该调整器将日期调整为在调整日期之后的指定日期的第一次出现
        LocalDateTime dateTime = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
        System.out.println("\n"+dateTime);

        // 实例:获取下一个工作日的日期
        LocalDateTime localDateTime3 = localDateTime.with((date) -> { LocalDateTime localDateTime2 = (LocalDateTime) date; DayOfWeek dayOfWeek = localDateTime2.getDayOfWeek(); if(dayOfWeek.equals(DayOfWeek.FRIDAY)){ return localDateTime2.plusDays(3); }else if(dayOfWeek.equals(DayOfWeek.SATURDAY)){ return localDateTime2.plusDays(2); }else{ return localDateTime2.plusDays(1); } }); System.out.println("\n"+localDateTime3); }

11.6 DateTimeFormatter: 解析和格式化

 该类提供了三种格式化方法:
 预定义的常量,如ISO_LOCAL_DATE
 使用模式字母,如uuuu-MMM-dd
 使用本地化样式,如long或medium
@Test
    public void test06(){
        LocalDateTime dateTime = LocalDateTime.now();

        // 使用预定义常量
        DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE;
        String str = dateTime.format(isoLocalDate);
        System.out.println(str);

        // 使用模式字母自定义
        DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
        String str1 = dateTime.format(ofPattern);
        System.out.println("\n"+str1);

        // 使用本地化
        LocalDateTime localDateTime = LocalDateTime.parse(str1, ofPattern);
        System.out.println("\n"+localDateTime);
    }

11.7.1 时区的处理01

ZoneId:该类中包含了所有的时区信息:
getAvailableZoneIds() : 可以获取所有时区信息
of(id) : 用指定的时区信息获取 ZoneId 对象
    @Test
    public void test07(){
        // 获取所有时区信息
        ZoneId.getAvailableZoneIds()
        .forEach(System.out::println);
    }

11.7.2 时区的处理02

Java8 中加入了对时区的支持,带时区的时间为分别为:
ZonedDate、ZonedTime、ZonedDateTime
其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式
例如 :Asia/Shanghai 等
@Test
    public void test08(){
        // 从默认时区的系统时钟获取当前的日期时间
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);

        // 获得时区
        ZoneId zone = zonedDateTime.getZone();
        System.out.println("\n"+zone);

        // 获得指定时区时间
        ZonedDateTime zonedDateTime2 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println("\n"+zonedDateTime2);

        // 获取指定时区的本地时间
        LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Colombo"));
        System.out.println("\n"+localDateTime);
    }

源码下载地址:https://download.csdn.net/download/hello_world_qwp/10401249
返回首页:https://blog.csdn.net/Hello_World_QWP/article/details/80245129

    原文作者:csdn-华仔
    原文地址: https://blog.csdn.net/Hello_World_QWP/article/details/80277859
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞