Java8的新特性--新时间日期API

目录

    • 一、简单介绍
    • 二、常见用法示例
      • 2.1 LocalDateTime、 LocalDate、 LocalTime
        • 2.1.1 获取当前时间
        • 2.1.2 时间日期的比较和运算判断
        • 2.1.3 时间日期的转换
      • 2.2 Instant 时间戳
      • 2.3 ZoneId
      • 2.5 Duration、Period 计算时间间隔
      • 2.6 TemporalAdjuster 时间矫正器


Java8提供了一套全新的日期时间API,都位于java.time包下,这个包涵盖了所有处理日期date、时间time、日期/时间dateTime、时区zone、时间戳instant、间隔duration、时钟clock等操作。

一、简单介绍

  • LocalDateTime:表示没有时区的日期时间,LocalDateTime是不可变并且线程安全的
  • LocalDate:表示没有时区的日期,LocalDate是不可变并且线程安全的
  • LocalTime:表示没有时区的时间,LocalTime是不可变并且线程安全的
  • Instant:用来表示时间线上的一个点(瞬时)
  • ZoneId:时区ID,用来确定Instant和LocalDateTime互相转换的规则
  • Clock:用于访问当前时刻、日期、时间,用到时区
  • Duration:用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
  • Period:用于两个“日期”间隔

二、常见用法示例

2.1 LocalDateTime、 LocalDate、 LocalTime

2.1.1 获取当前时间

@Test
public void teat01(){

        //LocalDateTime(日期时间) LocalDate(日期) LocalTime(时间)
        // 类的实例变量是不可变得对象,所以是线程安全的,它们分别表示使
        // 用ISO-8601日历系统的时间(ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法)
        // 都位于java.time包下

        //获取当前时间
        LocalDateTime now = LocalDateTime.now();
        LocalDate now1 = LocalDate.now();
        LocalTime now2 = LocalTime.now();
        System.out.println("【当前日期时间】"+now);
        System.out.println("【当前日期】"+now1);
        System.out.println("【当前时间】"+now2);

        //LocalDate  指定一个日期
        LocalDate localDate = LocalDate.now();
        System.out.println("【当前日期】"+localDate);
        LocalDate year = localDate.withDayOfYear(100);
        System.out.println("【当前日期为基础,指定本年当中的第几天,1-31号】"+year);
        LocalDate month = localDate.withDayOfMonth(2);
        System.out.println("【当前日期为基础,指定本月当中的第几月,1-31号】"+month);
        System.out.println("【当前日期为基础,直接指定月份】"+LocalDate.now().withMonth(5));

        //LocalDateTime 获取当前日期
        System.out.println("【当前时间】"+LocalDateTime.now());
        System.out.println("【当前时间是本年的第几天】"+LocalDateTime.now().getDayOfYear());
        System.out.println("【当前时间是本月的第几个天】"+LocalDateTime.now().getDayOfMonth());
        System.out.println("【当前时间是周几】"+LocalDateTime.now().getDayOfWeek());
        //获取年月日    当前时间】2021年MARCH月20日9时43分43秒
        System.out.println("【当前时间】"+LocalDateTime.now().getYear()+"年"+LocalDateTime.now().getMonth()+"月"+LocalDateTime.now().getDayOfMonth() +"日"
                +LocalDateTime.now().getHour()+"时"+LocalDateTime.now().getMinute()+"分"+LocalDateTime.now().getSecond()+"秒");

    }

运行结果

Java8的新特性--新时间日期API_第1张图片

2.1.2 时间日期的比较和运算判断

   @Test
    public void teat02(){

        System.out.println("【当前时间加一年加一天】"+LocalDateTime.now().plusYears(1).plusDays(1));
        System.out.println("【当前时间减俩月】"+LocalDateTime.now().minusMonths(2));

        LocalDate localDate1 = LocalDate.of(2021, 03, 20);
        LocalDate localDate2 = LocalDate.of(2020, 03, 20);
        System.out.println(localDate1.isBefore(localDate2));

        //判断是否闰年
        System.out.println(LocalDate.now()+"【当前时间是否闰年】"+LocalDate.now().isLeapYear());

    }

运行结果

Java8的新特性--新时间日期API_第2张图片

2.1.3 时间日期的转换

    @Test
    public void teat05(){

        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String format = dateTimeFormatter.format(now);
        System.out.println(now);
        System.out.println(format);

    }

运行结果

Java8的新特性--新时间日期API_第3张图片

2.2 Instant 时间戳

时间戳对应的是java.time.instant,专门用于时间戳的运算,时间戳是指是指:从Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始到某个时间之间的毫秒值。另外,时间戳是给计算机读的不是给人读的。

时间戳实际上就是Java8以前的Date,两者可以互相转换。

Date.from(Instant.now())把Instant转成java,util,date

new Date().toInstant()把Date转成Instant

    //时间戳
    @Test
    public void teat03(){
        //默认获取的是以UTC时区(世界协调时间,也叫格林威治时间)为基础的时间戳
        //中国在东八区,所以这个输出的时间是差了八个时区的
        Instant instant = Instant.now();
        System.out.println("【当前时间时间戳为】"+instant);

        //做一个偏移量的运算   偏移八个时区即为中国时间
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println("【当前时间时间戳偏移八个时区】"+offsetDateTime);

        System.out.println("当前时间的毫秒值"+Instant.now().toEpochMilli());
        System.out.println("系统当前的毫秒值"+System.currentTimeMillis());
        
        //相互转换
        //Date.from(Instant.now())把Instant转成java,util,date
        Date date = Date.from(Instant.now());
        System.out.println("【date】 "+date);
        //new Date().toInstant()把Date转成Instant
        Instant instant1 = date.toInstant();
        System.out.println("【instant】"+instant1);
    }

运行结果

Java8的新特性--新时间日期API_第4张图片

2.3 ZoneId

Java8中加入了对时区的支持,带时区的时间分别为ZoneDate、ZoneTime、ZoneDateTime.其中每个时区都对应着地区ID,地区ID都为“{区域}/{城市}”的格式,比如Asia/Shanghai.

java.time.ZoneId的类包含了所有的时区信息,下面我们来看下支持的时区都是有哪些。

    //ZoneId
    @Test
    public void test03(){
        //可以查看所有Java8中支持的时区
        Set availableZoneIds = ZoneId.getAvailableZoneIds();
        System.out.println("支持的时区个数:"+availableZoneIds.size());
        //指定一个时区去构建一个日期
        LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(ldt);
        //构建出一个带时区的时间日期
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Asia/Shanghai"));
        System.out.println(zdt);
    }

运行结果
Java8的新特性--新时间日期API_第5张图片

2.5 Duration、Period 计算时间间隔

Period计算两个日期之间的间隔

Duration计算两个时间或时间戳之间的间隔

    @Test
    public void test04(){
        Instant instant1 = Instant.now();
        LocalDateTime localDateTime1 = LocalDateTime.now();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Instant instant2 = Instant.now();
        LocalDateTime localDateTime2 = LocalDateTime.now();
        //时间戳的间隔
        System.out.println(Duration.between(instant1,instant2));
        System.out.println(Duration.between(instant2,instant1));

        //日期时间的间隔
        System.out.println(Duration.between(localDateTime1,localDateTime2));
        //获取毫秒值
        System.out.println("时间戳的间隔计算 "+Duration.between(instant1,instant2).toMillis());
        System.out.println("日期时间的间隔计算 "+Duration.between(localDateTime1,localDateTime2).toMillis());

        //Period
        LocalDate ld1 = LocalDate.of(2020, 3, 20);
        LocalDate ld2 = LocalDate.now();

        Period period = Period.between(ld1, ld2);
        System.out.println("Period计算日期间隔 "+period);
        System.out.println(period.getYears()+"年"+period.getMonths()+"月"+period.getDays()+"日");

    }

运行结果

Java8的新特性--新时间日期API_第6张图片

2.6 TemporalAdjuster 时间矫正器

TemporalAdjuster时间矫正器可以用来执行一些特殊的操作,比如要获取下一个工作日,下一个周五等操作。

TemporalAdjusters类通过静态方法提供了大量常用TemporalAdjuster的实现。

   @Test
    public void teat08(){

        LocalDateTime localDateTime = LocalDateTime.now();
        LocalDateTime with = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
        //下一个周五
        System.out.println(with);//打印输出 2021-03-26T11:31:53.682
    }

总结,日期时间完结。

你可能感兴趣的:(Java8的新特性,java)