Java

【JAVA8新特性】- 时间类

2019-09-28  本文已影响0人  lconcise

Java8以前, Date、Calendar,DateFormat 等组成的「传统时间日期 API」,但是传统的处理接口设计并不是很友好,不易使用。终于,Java 8 借鉴第三方优秀开源库 Joda-time,重新设计了一套 API。

在java8中,java.time包下主要包含下面几个主要的类:

Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间

以及java.time.format包中的

DateTimeFormatter:时间格式化

下面来学习下Java8的时间日期。

java8时间类与Date类的相互转化

Date与Instance相互转换

        // Date与Instance相互转换
        Instant instant = Instant.now();
        Date date12 = Date.from(instant);
        Instant instant1 = date12.toInstant();

Date 转 LocalDateTime

        // Date 转 LocalDateTime
        Date date13 = new Date();
        LocalDateTime localDateTime4 = LocalDateTime.ofInstant(date13.toInstant(), ZoneId.systemDefault());

LocalDateTime 转 Date

        LocalDateTime localDateTime5 = LocalDateTime.now();
        Instant instant2 = localDateTime5.atZone(ZoneId.systemDefault()).toInstant();
        Date date14 = Date.from(instant2);

LocalDate 转 Date
因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间:00::00:00

        LocalDate localDate2 = LocalDate.now();
        Instant instant3 = localDate2.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        Date.from(instant3);

LocalDate

LocalDate类型包含了年月日信息,下面举些LocalDate的使用示例:

        LocalDate date = LocalDate.of(2019, 6, 2);  // 2019-06-02
        int year = date.getYear();  // 2019
        int month = date.getMonth().getValue(); // 6
        int day = date.getDayOfMonth(); // 2

        // 查询该月有几天
        int lengthOfMonth = date.lengthOfMonth(); // 30
        // 查询该年有几天
        int lengthOfYear = date.lengthOfYear();   // 365
        // 是否是闰年
        boolean leapYear = date.isLeapYear();
        // 获取当前时间日期
        LocalDate now = LocalDate.now();

除了调用LocalDate的getYear方法外,我们也可以使用ChronoField枚举类型来实现相同的功能:

        int year1 = date.get(ChronoField.YEAR);
        int monthOfYear = date.get(ChronoField.MONTH_OF_YEAR);
        int dayOfMonth = date.get(ChronoField.DAY_OF_MONTH);
        // 当前日期属于该月第几周
        int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
image.png

我们也可以修改LocalDate对象:

        LocalDate date2 = LocalDate.of(2019, 6, 2);// 2019-06-02
        LocalDate date3 = date2.withDayOfMonth(1); // 2019-06-01
        LocalDate date4 = date2.with(ChronoField.DAY_OF_MONTH, 1); // 2019-06-01
        LocalDate date5 = date2.withYear(2018); // 2018-06-02
        LocalDate date6 = date2.plusDays(5); // 2019-06-07
        LocalDate date7 = date2.plus(5, ChronoUnit.DAYS); // 2019-06-07
        LocalDate date8 = date2.minusYears(10); // 2009-06-02

TemporalAdjusters类提供了许多静态方法来修改LocalDate对象。当我们需要获取下一个周天,下一个工作日,本月的最后一天等信息时,TemporalAdjusters类便可派上用场:

        // 下一个周一
        LocalDate date9 = date2.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
        // 本月最后一天
        LocalDate date10 = date2.with(TemporalAdjusters.lastDayOfMonth());
        // 上一个周六
        LocalDate date11 = date2.with(TemporalAdjusters.previous(DayOfWeek.SATURDAY));

还可以对LocalDate进行格式化操作:

        String str1 = date2.format(DateTimeFormatter.BASIC_ISO_DATE); // 20190602
        String str2 = date2.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2019-06-02

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String str3 = date.format(dtf);  // 2019-06-02
        LocalDate date1 = LocalDate.parse(str3, dtf); // 2019-06-02

LocalDate和下面要介绍的LocalTime,LocalDateTime之间共享了许多类似的方法,上面介绍的LocalDate修改、格式化等方法通用适用于LocalTime和LocalDateTime

LocalTime

LocalTime和LocalDate类似,区别在于LocalTime包含的是时分秒(毫秒)信息。举些LocalTime的例子:

        LocalTime time = LocalTime.of(17, 24, 30); // 17:24:30
        int hour = time.getHour();     // 17
        int minute = time.getMinute(); // 24
        int second = time.getSecond(); // 30

LocalDate和LocalTime都可以通过字符串来创建:

        LocalDate localDate = LocalDate.parse("2019-06-02");  // 2019-06-02
        LocalTime localTime = LocalTime.parse("17:26:30");    // 17:26:30

LocalDateTime

LocalDateTime是LocalDate和LocalTime的组合形式,包含了年月日时分秒信息。举些LocalDateTime的使用示例:

        LocalDateTime localDateTime = LocalDateTime.of(2019, 6, 2, 17, 26, 30); // 2019-06-02T17:26:30
        LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime);  // 2019-06-02T17:26:30

LocalDateTime可以转换为LocalDate和LocalTime,转换后包含的信息减少了:

        LocalDate localDate1 = localDateTime.toLocalDate(); // 2019-06-02
        LocalTime localTime1 = localDateTime.toLocalTime(); // 17:26:30

同样的,LocalDate和LocalTime也可以转换为LocalDateTime,只需要补上日期或者时间:

        LocalDateTime localDateTime2 = localDate.atTime(localTime); // 2019-06-02T17:26:30
        LocalDateTime localDateTime3 = localTime.atDate(localDate); // 2019-06-02T17:26:30

Duration

Duration用于计算两个LocalTime或者LocalDateTime的时间差,例如:

LocalTime time2 = LocalTime.of(23, 59, 59);
Duration duration = Duration.between(time1, time2);
long seconds = duration.getSeconds(); // 13565

手动创建Duration对象:

        Duration duration = Duration.ofMinutes(3);
        duration = Duration.of(3, ChronoUnit.MINUTES);

Period

Period用于计算两个LocalDate之间的时长。举些例子:

        LocalDate date01 = LocalDate.of(2019, 6, 1);
        LocalDate date02 = LocalDate.of(2019, 7, 2);
        Period period = Period.between(date01, date02);
        int months = period.getMonths();  // 1
        int days = period.getDays();      // 1

同样的,我们也可以手动创建Period对象:

        Period ofDays = Period.ofDays(5);
        Period ofWeeks = Period.ofWeeks(5);
        Period period1 = Period.of(2, 6, 1);

比较两个时间的先后

        LocalDate date03 = LocalDate.of(2019, 6, 1);
        LocalDate date04 = LocalDate.of(2019, 7, 2);
        boolean equal = date03.isEqual(date04);   // false
        boolean after = date03.isAfter(date04);   // false
        boolean before = date03.isBefore(date04); // true

MonthDay使用

        LocalDate birthday = LocalDate.of(1993, 12, 19);
        MonthDay monthDay = MonthDay.from(birthday);
        MonthDay currentMonthDay = MonthDay.now();
        if(monthDay.equals(currentMonthDay)){
            System.out.println("Happy Birthday!");
        }

假如用户的生日是1993年12月19号,那么可以通过这种方法来判断今天是否是用户的生日,如果是的话便发送生日祝福。同样的也有YearMonth类。

参考文章:
https://www.jianshu.com/p/2949db9c3df5
https://juejin.im/post/5addc7a66fb9a07aa43bd2a0
https://mrbird.cc/java8-new-time-date-api.html

上一篇 下一篇

猜你喜欢

热点阅读