zoukankan      html  css  js  c++  java
  • java8新特性学习六(新时间日期API)

    在java8以前,做有关时间日期的操作时使用java.util.Date,做日期、月份、天数相加减操作时使用java.util.Calendar,对时间日期进行格式化操作时,使用SimpleDateFormat或DateFormat下的其他子类;但是这些时间日期操作对象,都是可变的、线程不安全的。

    java8出的新的时间日期java.timeAPI都是线程安全的,并且性能更好,代码更简洁!

    ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则

      //获得本地默认时区
            ZoneId defaultZoneId = ZoneId.systemDefault();
            Instant instant=Instant.now();
            System.out.println(defaultZoneId+"-------"+instant);
    
            LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate();
            LocalDateTime localDateTime = instant.atZone(defaultZoneId).toLocalDateTime();
            System.out.println(localDate+"-------"+localDateTime);

    Instant: 用来表示时间线上的一个点(瞬时),表示一个时间戳。Instant可以精确到纳秒,这超过了long的最大表示范围,所以在Instant的实现中是分成了两部分来表示,一部分是seconds,表示从1970-01-01 00:00:00开始到现在的秒数,另一个部分是nanos,表示纳秒部分。

          //默认获取UTC时区,相对于GMT晚了八个小时
            Instant instant=Instant.now();
            System.out.println(System.currentTimeMillis());
            System.out.println("秒:"+instant.getEpochSecond()+"----毫秒:"+instant.toEpochMilli());
            System.out.println(instant);
    
            OffsetDateTime odt = instant.atOffset(ZoneOffset.ofHours(8));
            System.out.println(odt);

    LocalDate、LocalTime、LocalDateTime类的实例是不可变的并且线程安全的对象,分别使用了ISO-8601系统日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

      //获取当前时间
            LocalDateTime ldt=LocalDateTime.now();
            System.out.println(ldt);
    
            //获取指定时间
            LocalDateTime ldt2=LocalDateTime.of(2020,06,02,11,11,11);
            System.out.println(ldt2);
    
            //对时间进行加减操作,都会产生一个新的日期对象,不会改变原来的日期对象
            //加2年
            LocalDateTime ldt3 = ldt.plusYears(2);
            System.out.println(ldt3);
    
            //减5天
            LocalDateTime ldt4 = ldt.minusDays(5);
            System.out.println(ldt4);
    
            //获取年月日
            System.out.println("year:"+ldt.getYear());
            System.out.println("month:"+ldt.getMonth()+"--"+ldt.getMonthValue());
            System.out.println("day:"+ldt.getDayOfMonth());
            System.out.println("hour:"+ldt.getHour()+"   minute:"+ldt.getMinute()+"   second:"+ldt.getSecond());
    
            //当前日期
            LocalDate ld1= LocalDate.now();
            System.out.println(ld1);
    
            //当前时间
            LocalTime lt1=LocalTime.now();
            System.out.println(lt1);

    Clock: 用于访问当前时刻、日期、时间,用到时区

           //获取当前clock
            Clock clock=Clock.systemUTC();
            //通过Clock获取当前时刻
            System.out.println("当前时刻为: "+clock.instant());
            //获取clock对应的毫秒数,与system.currentTimeMillis()输出相同
            System.out.println(clock.millis());
            System.out.println(System.currentTimeMillis());
            System.out.println(Instant.now().toEpochMilli());

    Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔

          //Duration 计算两个时间的间隔
            Instant instant1=Instant.now();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Instant instant2=Instant.now();
            System.out.println(instant2.toEpochMilli()-instant1.toEpochMilli());
    
            Duration duration1 = Duration.between(instant1, instant2);
            System.out.println(duration1.getSeconds()+"--"+duration1.toMillis());
    
            System.out.println("------------------------------");
    
            LocalTime lt1=LocalTime.now();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LocalTime lt2= LocalTime.now();
            Duration duration2 = Duration.between(lt1, lt2);
            System.out.println(duration2.getSeconds()+"--"+duration2.toMillis());
    
            System.out.println("*********************");
            LocalDateTime ldt1= LocalDateTime.now();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LocalDateTime ldt2=LocalDateTime.now();
            Duration duration3 = Duration.between(ldt1, ldt2);
            System.out.println(duration3.getSeconds()+"--"+duration3.toMillis());

    Period: 用于计算两个“日期”间隔

     //Period 计算日期的间隔
            LocalDate ld1=LocalDate.of(2019,04,22);
            LocalDate ld2= LocalDate.now();
            Period period1 = Period.between(ld1, ld2);
            System.out.println(ld1+"---------"+ld2);
            System.out.println(period1);
            System.out.println("相差年月日:"+period1.getYears()+"年"+period1.getMonths()+"月"+period1.getDays()+"日");
            System.out.println("相差天数为:"+(ld2.toEpochDay()-ld1.toEpochDay()));
    TemPoralAdjuster 时间校正器
        //TemPoralAdjuster 时间校正器,
            LocalDateTime ldt1=LocalDateTime.now();
            System.out.println(ldt1);
    
            //指定这个月的5号
            LocalDateTime ldt2 = ldt1.withDayOfMonth(5);
            System.out.println(ldt2);
    
            //下个星期天   TemporalAdjusters通过静态方法提供了大量的常用TemporalAdjuster的实现
            LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
            System.out.println(ldt3);
    
            //自定义,当前时间加7天
            LocalDateTime ldt5 = ldt1.with((l) -> {
                LocalDateTime ldt4 = (LocalDateTime) l;
                return ldt4.plusDays(7);
            });
            System.out.println(ldt5);
    DateTimeFormatter 格式化时间/日期
         //DateTimeFormatter 格式化时间/日期
            LocalDateTime ldt1=LocalDateTime.now();
            DateTimeFormatter dtf=DateTimeFormatter.ISO_DATE_TIME;
            String strTime=ldt1.format(dtf);
            System.out.println(strTime);
    
            //java8以前时间格式化
            Date date=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println(sdf.format(date));
    
            //自定义格式
            //把日期时间格式化为字符串
            DateTimeFormatter dtf2= DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
            String strTime2=ldt1.format(dtf2);
            System.out.println(strTime2);
            //把字符串日期格式化为日期时间
            LocalDateTime ldt2=LocalDateTime.parse(strTime2,dtf2);
            System.out.println(ldt2);
    
    ZonedDate、ZonedTime、ZonedDateTime 带时区的时间
       //获取所有时区
            Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
            availableZoneIds.forEach(System.out::println);
    
            LocalDateTime ldt1=LocalDateTime.now(ZoneId.of("Asia/Singapore"));
            System.out.println(ldt1);
    
            LocalDateTime ldt2=LocalDateTime.now();
            System.out.println(ldt2);
            ZonedDateTime zdt1 = ldt2.atZone(ZoneId.of("Asia/Shanghai"));
            System.out.println(zdt1);
  • 相关阅读:
    RabbitMQ之六种队列模式
    面试资料
    位掩码的介绍与使用(小白鼠试毒问题)
    递归函数的写法(以strcpy函数为例)
    查找算法简介及实现
    八大排序算法概述及实现
    快速排序算法(一)
    最大(小)堆和堆排序简介
    满二叉树各种节点数目的计算
    LPSTR、LPCSTR、LPWSTR、LPCWSTR、LPTSTR、LPCTSTR的来源及意义
  • 原文地址:https://www.cnblogs.com/mabaoying/p/12982394.html
Copyright © 2011-2022 走看看