1.为什么要使用java8新实现的时间与日期API

在java8以前与时间有关的接口:

(1) 当你在做有关时间日期的操作时,你会想到用Date;

(2) 当你在做日期、月份、天数相加减时,你会想到用Calendar;

(3) 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类;

但是这几个操作时间的类都是线程不安全的,它们都是可变的,在多线程的环境下使用这些类是会造成线程安全的问题的。所以在java8中实现的新的时间与日期API,这些新的API都是线程安全的

2.java8中的时间日期API介绍

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

3.自己写的demo

1.获取当前日期

        //获取当前日期
        LocalDate now = LocalDate.now();
        System.out.println(now);

2.对当前日期进行格式化 

        //对当前日期进行格式化
        LocalDate now = LocalDate.now();
        String yyyyMMdd = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
        System.out.println(yyyyMMdd);

3.获取年月日

        //获取年月日
        LocalDate now = LocalDate.now();
        int year = now.getYear();
        int monthValue = now.getMonthValue();
        int dayOfMonth = now.getDayOfMonth();
        System.out.println(year + "-" + monthValue + "-" + dayOfMonth);

4.自定义时间进行格式化处理

        //特殊时间的处理
        String inDate = "20220202";
        LocalDate of = LocalDate.of(Integer.parseInt(inDate.substring(0, 4)), Integer.parseInt(inDate.substring(4, 6)), Integer.parseInt(inDate.substring(6, 8)));
        System.out.println(of.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        //使用预定义的格式化工具去解析或格式化日期
        //DateTimeFormatter主要用于解析和格式话,更多的使用方式可以查看java8的api
        /*BASIC_ISO_DATE
         格式化或解析没有偏移量的日期的ISO日期格式化程序,例如“20111203”。*/
        String dayAfterTommorrow = "20180210";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
        /*ISO_LOCAL_DATE
         ISO日期格式化程序格式化或解析没有偏移量的日期,如“2011-12-03”。*/
        String dayAfterTommorrow2 = "2018-02-10";
        LocalDate formatted2 = LocalDate.parse(dayAfterTommorrow2, DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow2, formatted2);

5.判断两个日期是否相等

        //判断两个日期是否相等
        LocalDate of1 = LocalDate.of(2022, 3, 2);
        LocalDate of2 = LocalDate.of(2022, 1, 2);
        System.out.println(of1 + "---" + of1.equals(of2));

6.获取当前时间

        //获取当前时间
        LocalTime time = LocalTime.now();
        System.out.println("local time now : " + time);
        System.out.println("local time now : " + time.format(DateTimeFormatter.ofPattern("hhmmss")));

7.获取当前日期时间

        //获取当前的日期时间
        LocalDateTime now1 = LocalDateTime.now();
        System.out.println(now1);
        System.out.println(now1.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));

8.在现有的时间上加上两个小时

        //在现有的时间上增加小时
        LocalTime timeAdd = LocalTime.now();
        LocalTime newTime = timeAdd.plusHours(2); // 增加两小时
        System.out.println("Time after 2 hours : " +  newTime);

9.计算一个星期之后的日期

        //计算一个星期之后的日期
        /*第一种方式*/
        LocalDate now2 = LocalDate.now();
        LocalDate localDate = now2.plusDays(7);
        System.out.println(localDate);
        /*第二种方式*/
        LocalDate localDate1 = now2.plusWeeks(1);
        System.out.println(localDate1);
        /*第三种方式*/
        LocalDate plus = now2.plus(1, ChronoUnit.WEEKS);
        System.out.println(plus);
        //计算一个星期之前的日期
        LocalDate now3 = LocalDate.now();
        /*方式一*/
        LocalDate localDate2 = now3.minusDays(7);
        System.out.println(localDate2);
        /*方式二*/
        LocalDate localDate3 = now3.minusWeeks(1);
        System.out.println(localDate3);
        /*方式三*/
        LocalDate minus = now3.minus(1, ChronoUnit.WEEKS);
        System.out.println(minus);

10.计算一年之后的日期

        //计算一年后的日期
        /*方式一*/
        LocalDate now4 = LocalDate.now();
        LocalDate localDate4 = now4.plusYears(1);
        System.out.println(localDate4);
        /*方式二*/
        LocalDate localDate5 = now4.plusMonths(12);
        System.out.println(localDate5);
        /*方式三*/
        LocalDate plus1 = now4.plus(1, ChronoUnit.YEARS);
        System.out.println(plus1);
        /*方式四*/
        LocalDate plus2 = now4.plus(12, ChronoUnit.MONTHS);
        System.out.println(plus2);

11.计算一年之前的日期

        //计算一年前的日期
        LocalDate now5 = LocalDate.now();
        /*方式一*/
        LocalDate localDate6 = now5.minusYears(1);
        System.out.println(localDate6);
        /*方式二*/
        LocalDate localDate7 = now5.minusMonths(12);
        System.out.println(localDate7);
        /*方式三*/
        LocalDate minus1 = now5.minus(1, ChronoUnit.YEARS);
        System.out.println(minus1);
        /*方式四*/
        LocalDate minus2 = now5.minus(12, ChronoUnit.MONTHS);
        System.out.println(minus2);

12.判断日期是早于还是晚于另一个日期

        LocalDate today = LocalDate.now();
        LocalDate tomorrow = LocalDate.of(2022, 3, 6);
        if(tomorrow.isAfter(today)){
            System.out.println("Tomorrow comes after today");
        }
        //减去一天
        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
        if(yesterday.isBefore(today)){
            System.out.println("Yesterday is day before today");
        }

13.检查是否闰年

        LocalDate today1 = LocalDate.now();
        if(today1.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2022 is not a Leap year");
        }

14.计算两个日期的间距(相差的天数\年数\月数)

        LocalDate now6 = LocalDate.now();
        LocalDate localDate8 = LocalDate.of(2018, 11, 14);
        Period periodToNextJavaRelease = Period.between(localDate8, now6);
        /*Period时期类并不是直接返回两个日期相差的天数,而是返回相差了多少年多少个月多少天*/
        System.out.println("日期"+localDate8+"距离"+now6+" 共: "
                + periodToNextJavaRelease.getYears() +"年" );
        System.out.println("日期"+localDate8+"距离"+now6+" 共: "
                + periodToNextJavaRelease.getMonths() +"个月" );
        System.out.println("日期"+localDate8+"距离"+now6+" 共: "
                + periodToNextJavaRelease.getDays() +"天" );
        /*返回两个日期相差的天数*/
        LocalDate from = LocalDate.of(2017, 9, 1);
        long day = LocalDate.now().toEpochDay() - from.toEpochDay();
        System.out.println("距离当前多少日:" + day);

15.获取时间戳

        //获取时间戳
        /*方式一,使用Timestamp与LocalDateTime*/
        Timestamp timestamp= Timestamp.valueOf(LocalDateTime.now());
        System.out.println(timestamp.getTime());
        /*方式二,使用instant*/
        Instant now7 = Instant.now();
        long l = now7.toEpochMilli();
        System.out.println(l);

16.MonthDay的使用

MonthDay可以处理一些周期事件,比如像生日、纪念日、法定假日(国庆以及春节)、或者每个月固定时间发送邮件给客户 这些周期性事件

        MonthDay now8 = MonthDay.now();
        LocalDate dateOfBirth = LocalDate.of(2018, 01, 21);
        MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());

        if(now8.equals(birthday)){
            System.out.println("Many Many happy returns of the day !!");
        }else{
            System.out.println("Sorry, today is not your birthday");
        }

17.YearMonth的使用

YearMonth是一个不变的日期时间对象,表示一年和一个月的组合。 可以获得可以从年和月派生的任何字段,例如四分之一年份。

        YearMonth currentYearMonth = YearMonth.now();
        System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
        /*Month是月份的枚举类1-12月,FEBRUARY为月份*/
        YearMonth creditCardExpiry = YearMonth.of(2028, Month.FEBRUARY);
        System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
        int i = currentYearMonth.lengthOfMonth();
        System.out.println("当前月份有多少天" + i);

目前就先写这些案例,场景不是很全,后续有用到新的API在做补充。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐