19. JDK8以后的时间类(Date类、日期格式化类、日历类、工具类)

在这里插入图片描述

JDK7以前的时间类

具体信息请查看 API 帮助文档

Date类

1. ZoneID类

ZoneID类是Java中的一个类,位于java.time包中,用于表示时区的标识符。

  • 时区是以相对于协调世界时(Coordinated Universal Time,UTC)的偏移量来表示地球上不同地区的时间差异。ZoneID类提供了一组静态方法和常量,用于获取和表示时区的标识符。

  • 通过ZoneID类,可以获取当前系统默认的时区,也可以根据特定地区的标识符获取对应的时区。它还可以通过偏移量创建自定义的时区。

  • ZoneID类还与其他日期和时间类紧密配合,可以将日期和时间对象转换为特定时区下的日期和时间,或者将特定时区下的日期和时间转换为其他时区。

需要注意的是,ZoneID类提供的时区标识符是根据区域性的命名约定来命名的,比如"America/New_York"、“Asia/Shanghai"等,而不是简单的”+/-时差的小时数"。

1.1 方法

ZoneId类:时区

静态方法 描述
getAvailableZoneIds() 获取Java中支持的所有时区的标识符
systemDefault() 获取系统默认时区的标识符
of(String zoneId) 根据指定的时区标识符获取ZoneId对象

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

1.2 代码示例
package text;

import java.time.ZoneId;
import java.util.Set;

/*
ZoneId类:时区
        static Set<string> getAvailableZoneIds() 获取Java中支持的所有时区
        static ZoneId systemDefault() 获取系统默认时区
        static Zoneld of(string zoneld) 获取一个指定时区

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

 */
public class text89 {
   
   
    public static void main(String[] args) {
   
   
        //获取支持的时区
        Set<String> set = ZoneId.getAvailableZoneIds();
        //打印集合
        System.out.println(set);//[Asia/Aden,…… US/Pacific, Europe/Monaco]
        //获取集合的长度
        System.out.println(set.size()); //603

        //获取系统默认的时区
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId);  //Asia/Shanghai

        //获取一个指定的时区
        ZoneId of = ZoneId.of("US/Pacific");
        System.out.println(of);    //US/Pacific
    }
}

2. Instant类

Instant类是Java中的一个类,位于java.time包中,用于表示时间戳。时间戳是距离1970年1月1日UTC时间的秒数或纳秒数。

  • Instant类提供了一组方法,用于处理和操作时间戳。它可以表示从1970年1月1日起的精确时间,以纳秒为单位。Instant类是不可变的,也就是说,一旦创建了一个Instant对象,就不能修改它的值。

  • 通过Instant类,可以获取当前的系统时间戳,也可以根据指定的时间戳值创建Instant对象。它还支持与其他日期和时间类的相互转换,可以将Instant对象转换为特定时区下的日期和时间,或者将特定时区下的日期和时间转换为Instant对象。

需要注意的是,Instant类是与计算机系统的时间概念相关的,它与时区无关,并以协调世界时(Coordinated Universal Time,UTC)为基准。

2.1 方法

Instant类:时间戳

静态方法 描述
now() 获取当前标准时间的Instant对象
ofEpochMilli(long epochMilli) 根据指定的毫秒数获取Instant对象
ofEpochSecond(long epochSecond) 根据指定的秒数获取Instant对象
ofEpochSecond(long epochSecond, long nanoAdjustment) 根据指定的秒数和纳秒数获取Instant对象
实例方法 描述
ZonedDateTime atZone(ZoneId zone) 将Instant对象转换为指定时区的ZonedDateTime对象
boolean isXxx(Instant otherInstant) 判断当前Instant对象是否满足指定条件
Instant minusXxx(long millisToSubtract) 从当前Instant对象减去指定的时间间隔
Instant plusXxx(long millisToAdd) 在当前Instant对象上增加指定的时间间隔

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

2.2 代码示例
package text;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

/*
Instant类:时间戳
    static Instant now()                            获取当前时间的Instant对象(标准时间)
    static Instant ofXxxx(long epochMilli)          根据(秒/毫秒/纳秒)获取Instant对象

    //以下方法不是静态方法,因此需要创建对象再使用
    ZonedDateTime atZone(ZoneIdzone)                指定时区
    boolean isxxx(Instant otherInstant)             判断系列的方法
    Instant minusXxx(long millisToSubtract)         减少时间系列的方法
    Instant plusXxx(long millisToSubtract)          增加时间系列的方法

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

 */
public class text90 {
   
   
    public static void main(String[] args) {
   
   
        //获取当前时间的Instant对象(标准时间)
        Instant now = Instant.now();
        System.out.println(now);       //2024-01-21T08:06:42.049Z


        //根据(秒/毫秒/纳秒)获取Instant对象
        Instant instant1 = Instant.ofEpochSecond(1l);    //根据秒获取Instant对象
        Instant instant2 = Instant.ofEpochMilli(2000l);  // 根据毫秒获取Instant对象
        Instant instant3 = Instant.ofEpochSecond(2l, 1000000000l);    //根据纳秒获取Instant对象
        System.out.println(instant1);   //1970-01-01T00:00:01Z
        System.out.println(instant2);   //1970-01-01T00:00:02Z
        System.out.println(instant3);   //1970-01-01T00:00:03Z


        //指定时区
        ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
        System.out.println(zonedDateTime);   //2024-01-21T16:12:10.778+08:00[Asia/Shanghai]


        //判断系列方法
        //获取对象
        Instant instant4 = Instant.ofEpochSecond(1l);
        Instant instant5 = Instant.ofEpochSecond(2l);
        //isAfter:判断调用者代表的时间是否在参数表示的时间的后面
        boolean after = instant4.isAfter(instant5);
        System.out.println(after);    //false
        //isBefore:判断调用者代表的时间是否在参数表示的时间前面
        boolean before = instant4.isBefore(instant5);
        System.out.println(before);     //true


        //减少时间系列的方法
        //获取对象
        Instant instant6 = Instant.ofEpochSecond(10l);
        System.out.println(instant6);      //1970-01-01T00:00:10Z
        Instant instant7 = instant6.minusSeconds(1l);
        System.out.println(instant7);      //1970-01-01T00:00:09Z


        //增加时间系列的方法
        //获取对象
        Instant instant8 = Instant.ofEpochSecond(10l);
        System.out.println(instant8);      //1970-01-01T00:00:10Z
        Instant instant9 = instant6.plusSeconds(1l);
        System.out.println(instant9);      //1970-01-01T00:00:11Z
    }
}

3. ZoneDateTime类

ZoneDateTime类是Java 8中的一个日期和时间类,它表示带有时区信息的日期和时间。

  • ZoneDateTime类是OffsetDateTime和ZonedDateTime的抽象类。它存储日期、时间和时区信息,并提供了一系列与日期和时间相关的方法。

  • ZoneDateTime类的实例可以使用静态工厂方法从特定的时区、地区、日期和时间构建。它还提供了获取日期、时间、时区、偏移量和UNIX时间戳的方法。

  • ZoneDateTime类还包含用于格式化和解析日期和时间字符串的方法。它可以将日期和时间转换为ISO-8601格式的字符串表示,也可以从ISO-8601格式的字符串解析出日期和时间。

3.1 方法

ZonedDateTime类:带时区的时间

静态方法 描述
static ZonedDateTime now() 获取当前时间的ZonedDateTime对象。
static ZonedDateTime ofXxxx(...) 获取指定时间的ZonedDateTime对象,根据提供的参数来构建对象。
实例方法
ZonedDateTime withXxx(时间) 返回一个修改了特定时间字段的ZonedDateTime对象,例如修改年、月、日、时、分、秒等。
ZonedDateTime minusXxx(时间) 返回一个减少了特定时间字段的ZonedDateTime对象,例如减少年、月、日、时、分、秒等。
ZonedDateTime plusXxx(时间) 返回一个增加了特定时间字段的ZonedDateTime对象,例如增加年、月、日、时、分、秒等。

注意:上述"时间"指的是一定的时间量,可以是年、月、日、时、分、秒等。具体的时间量可根据具体方法而定,例如withYear(int year)修改年份,minusHours(long hours)减少小时数,plusMinutes(long minutes)增加分钟数等。

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

3.2 代码示例
package text;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

/*
ZonedDateTime类:带时区的时间
   static ZonedDateTime now()                获取当前时间的ZonedDateTime对象
   static ZonedDateTime ofXxxx(。。。)        获取指定时间的ZonedDateTime对象

   //以下方法不是静态方法,因此需要创建对象再使用
   ZonedDateTime withXxx(时间)                修改时间系列的方法
   ZonedDateTime minusXxx(时间)               减少时间系列的方法
   ZonedDateTime plusXxx(时间)                增加时间系列的方法

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
 */
public class text91 {
   
   
    public static void main(String[] args) {
   
   
        //获取当前时间的ZonedDateTime对象(带时区)
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);      //2024-01-21T16:31:29.175+08:00[Asia/Shanghai]


        //获取指定时间的ZonedDateTime对象
        //方式一:年月日时分秒的方式指定
        ZonedDateTime time1 = ZonedDateTime.of(2024, 06, 07, 12, 00, 59, 0, ZoneId.of("Asia/Shanghai"));
        System.out.println(time1);   //2024-06-07T12:00:59+08:00[Asia/Shanghai]

        //方式二:通过Instant + 时区 的方式指定获取时间对象
        //获取Instant对象
        Instant instant = Instant.now();
        //获取时区对象
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        ZonedDateTime time2 = ZonedDateTime.ofInstant(instant, zoneId);
        System.out.println(time2);    //2024-01-21T16:37:51.888+08:00[Asia/Shanghai]


        //修改时间系列的方法
        System.out.println(time1);   //2024-06-07T12:00:59+08:00[Asia/Shanghai]
        ZonedDateTime time3 = time1.withYear(2030);
        System.out.println(time3);   //2030-06-07T12:00:59+08:00[Asia/Shanghai]


        //减少时间系列的方法
        System.out.println(time1);  //2024-06-07T12:00:59+08:00[Asia/Shanghai]
        ZonedDateTime time4 = time1.minusYears(1);
        System.out.println(time4);  //2023-06-07T12:00:59+08:00[Asia/Shanghai]


        //增加时间系列的方法
        System.out.println(time1);   //2024-06-07T12:00:59+08:00[Asia/Shanghai]
        ZonedDateTime time5 = time1.plusYears(1);
        System.out.println(time5);   //2025-06-07T12:00:59+08:00[Asia/Shanghai]

    }
}

日期格式化类

1. DateTimeFormatter类

  • DateTimeFormatter类是Java 8中的一个日期和时间格式化类,它用于将日期和时间对象格式化为字符串,或将字符串解析为日期和时间对象。

  • DateTimeFormatter类提供了一系列预定义的格式化模式,用于指定日期和时间的输出格式。例如,可以使用"yyyy-MM-dd"指定年、月、日的格式,或使用"HH:mm:ss"指定小时、分钟、秒的格式。它还支持自定义的格式模式。

  • DateTimeFormatter类还提供了方法来设置和获取不同的字段,例如设置解析时所需的解析上下文,或获取格式化器的本地化信息。

  • DateTimeFormatter类的实例可以使用静态工厂方法创建,也可以使用ofPattern方法根据提供的模式字符串创建。它可以与日期和时间类一起使用,例如LocalDateTime、ZonedDateTime等。

1.1 方法

DateTimeFormatter类:用于时间的格式化和解析

静态方法 描述
static DateTimeFormatter ofPattern(String pattern) 获取具有指定格式的DateTimeFormatter对象。
实例方法
String format(时间对象) 将给定的时间对象按照DateTimeFormatter定义的格式进行格式化,并返回格式化后的字符串。

细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间

1.2 代码示例
package text;

import java.time.ZonedDateTim
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值