Java8时间和日期API

Posted 我永远信仰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8时间和日期API相关的知识,希望对你有一定的参考价值。

时间和日期API(记录下来当成字典查用了)

旧版日期时间API存在的问题

  1. 设计很差:在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。此外用于格式化和解析的类在java.text包中定义。

  2. 非线程安全: java.util.Date是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

  3. 时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和
    java.util.TimeZone类,但他们同样存在上述所有的问题。

新日期时间API介绍

JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于java.time包中,下面是一些关键类。

Loca1Date:表示日期,包含年月日,格式为2019-10-16
LocalTime:表示时间,包含时分秒,格式为16:38:54.158549300
LocalDateTime:表示日期时间,包含年月日,时分秒,格式为2018-09-06T15:33:56.750
DateTimeFormatter :日期时间格式化类。
lnstant:时间戳,表示—个特定的时间瞬间。
Duration:用于计算2个时间(LocalTime,时分秒)的距离Period:用于计算2个日期(LocalDate,年月日)的距离
ZonedDateTime:包含时区的时间

掌握JDK 8的日期和时间类

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Test01 
    public static void main(String[] args) 
//LocalDate 表示日期,不包含时分秒
        LocalDate now = LocalDate.now();//获取当前日期,不用new
        System.out.println(now);//2021-08-25
        System.out.println(now.getYear());//2021
        System.out.println(now.getMonthValue());//获取月
        System.out.println(now.getDayOfMonth());//获取这个月的多少号
        System.out.println(now.getDayOfWeek());//获取星期几
        System.out.println(now.getDayOfYear());//获取是这一年的第几天,可以用来计算你和女朋友的纪念日

//LocalTime:表示时间,包含时分秒 毫秒
        LocalTime localTime =LocalTime.now();
        System.out.println(localTime);//14:15:26.262
        System.out.println(localTime.getNano());//获取纳秒

        //LocalDateTime:表示日期时间,包含上面两个
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);//2021-08-25T14:18:37.586
        System.out.println(dateTime.withYear(2000));//2000-08-25T14:21:21.634 ,修改年

        //增加plus或减少minus时间
        System.out.println(dateTime.plusYears(6));//2027-08-25T14:22:42.672
        System.out.println(dateTime.minusYears(6));//2015-08-25T14:23:34.188

        /**
         * 比较时间
         * isAfter()
         * isBefore()
         * isEqual()
         */
    

掌握JDK8的时间格式化与解析

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test02 
    public static void main(String[] args) 
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);//2021-08-25T14:39:34.908

        //JDK自带的格式
        DateTimeFormatter isoDate = DateTimeFormatter.ISO_LOCAL_DATE;
        System.out.println(dateTime.format(isoDate));//2021-08-25

//自定义格式
        //1.定义自定义格式,
        String format="yyyy年MM月dd日 HH:mm:ss";
        //2.获得这个格式,
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        //3.格式化
        String timeString = dateTime.format(dtf);
        System.out.println(timeString);//2021年08月25日 14:43:41

//解析格式化的时间,反解析
        LocalDateTime parse = LocalDateTime.parse(timeString,dtf);
        System.out.println(parse);//2021-08-25T14:43:41

    

掌握JDK 8的Instant时间戳

instant内部保存了秒,一般不是给用户用的,而是方便我们程序做一些统计的

使用方法差不多,有加减、获取时分秒、毫秒、纳秒

了解JDK 8的计算日期时间差类

Duration、Period类。

package com.yong.time;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;

public class Test03 
    public static void main(String[] args) 
        LocalTime now = LocalTime.now();
        LocalTime time = LocalTime.of(11, 20, 30);

        //Duration计算时间的距离
        Duration duration = Duration.between(time, now);
        System.out.println(duration);
        System.out.println("相差的天数"+duration.toDays());
        System.out.println("相差的小时数"+duration.toHours());
        System.out.println("相差的分钟数"+duration.toMinutes());
        System.out.println("相差的毫秒数"+duration.toMillis());


        //Period计算日期的距离,后面的减去前面的。
        LocalDate now1 = LocalDate.now();
        LocalDate date = LocalDate.of(11, 11, 11);
        Period period = Period.between(date,now1);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());

    

了解JDK8设置日期时间的时区

Java8中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为: ZonedDate、ZonedTime、ZonedDateTime。

其中每个时区都对应着ID,ID的格式为“区域/城市”。例如:Asia/Shanghai 等。

zoneld:该类中包含了所有的时区信息。

import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Test04 
    public static void main(String[] args) 
        //获取所有时区
        ZoneId.getAvailableZoneIds().forEach(System.out::println);

        //获取不带时区的时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);//2021-08-25T15:22:27.004

        //获取世界标准时间
        ZonedDateTime dateTime = ZonedDateTime.now(Clock.systemUTC());
        System.out.println(dateTime);//2021-08-25T07:26:43.917Z

        //获取带时区的时间
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);//2021-08-25T15:22:27.004+08:00[Asia/Shanghai]
        // 上海的时间
        // +08:00表示于标准的时间时间之差

        //使用指定的时区 创建时间
        ZonedDateTime time = ZonedDateTime.now(ZoneId.of("America/Vancouver"));//温哥华
        System.out.println(time);//2021-08-25T00:25:01.018-07:00[America/Vancouver]
    

以上是关于Java8时间和日期API的主要内容,如果未能解决你的问题,请参考以下文章

JAVA8新特性随笔

LocalDateTime JDK1.8

《Java8实战》读书笔记11:Java8中新的日期时间API

《Java8实战》读书笔记11:Java8中新的日期时间API

为什么不建议使用Date,而是使用Java8新的时间和日期API?

java8 - 新的时间日期API示例