Java之时间类2(JDK8新增)

一、Date类

(一)、ZoneId:时区
1、概述

        ZoneId是Java 8中处理时区的类。它用于表示时区标识符,例如“America/New_York”或“Asia/Tokyo”。一共有600个时区。

2、常用方法:
static Set<String> getAvailableZoneIds()获取Java中支持的所有时区
static ZoneId systemDefault()获取系统默认时区
static ZoneId of(String zoneId)获取一个指定的时区
// 获取Java中支持的所有时区
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);

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

// 获取一个指定的时区
ZoneId zoneId1 = ZoneId.of("Asia/Pontianak");
System.out.println(zoneId1);
(二)、Instant:时间戳
1、概述

        Instant是Java 8中新添加的类,用于表示时间戳。它是一个包含秒数和纳秒数的不可变对象,可以精确到纳秒级别。

2、常用方法:
static Instant now()获取当前时间的Instant对象(标准时间)
static Instant ofXXX(long epochMilli)根据(秒/毫秒/纳秒)获取Instant对象
ZoneDateTime atZone(ZoneId zone)指定时区
boolean isXXX(Instant otherInstant)判断系列的方法
Instant minusXXX(long millisToSubtract)减少时间系列的方法
Instant plusXXX(long millisToSubtract)增加时间系列的方法
// 获取当前时间的Instant对象(标准时间)
Instant now = Instant.now();
System.out.println(now);

// 根据(秒/毫秒/纳秒)获取Instant对象
Instant instant = Instant.ofEpochMilli(0L);
System.out.println(instant);

Instant instant1 = Instant.ofEpochSecond(1L);
System.out.println(instant1);

Instant instant2 = Instant.ofEpochSecond(1L, 1000000000L);
System.out.println(instant2);

// 指定时区
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);

// 判断系列的方法
Instant instant3 = Instant.ofEpochMilli(0L);
Instant instant4 = Instant.ofEpochMilli(1000L);

System.out.println(instant3.isBefore(instant4));
System.out.println(instant3.isAfter(instant4));

// 减少时间系列的方法
Instant instant5 = Instant.ofEpochMilli(3000L);
System.out.println(instant5);

Instant instant6 = instant5.minusSeconds(1);
System.out.println(instant6);

// 增加时间系列的方法
Instant instant7 = Instant.ofEpochMilli(0L);
System.out.println(instant7);

Instant instant8 = instant7.plusSeconds(10);
System.out.println(instant8);
(三)、ZoneDateTime:带时区的时间
1、概述

        ZoneDateTime是Java 8中的日期时间类,表示带有时区偏移量的日期时间信息。它是LocalDateTime类和ZoneId类的结合,同时包含了时区信息和本地日期时间。它可以用来表示任意时区中的日期时间信息,并且可以方便地进行时区之间的转换。

2、常用方法:

  1. now():返回当前时区的当前时间。

  2. of():根据指定的年、月、日、小时、分钟、秒和时区创建一个 ZonedDateTime 对象。

  3. toInstant():将 ZonedDateTime 对象转换为 Instant 对象,即从时区时间转为标准时间。

  4. withZoneSameInstant():根据指定时区,将 ZonedDateTime 对象转换为同一时刻的另一个时区时间。

  5. withZoneSameLocal():根据指定时区,将 ZonedDateTime 对象转换为同一本地时间的另一个时区时间。

  6. toLocalDateTime():将 ZonedDateTime 对象转换为 LocalDateTime 对象,即去掉时区信息。

  7. format():格式化 ZonedDateTime 对象为指定格式的时间字符串。

  8. getYear():获取年份。

  9. getMonth():获取月份。

  10. getDayOfMonth():获取日期。

  11. getDayOfWeek():获取星期几。

  12. getHour():获取小时。

  13. getMinute():获取分钟。

  14. getSecond():获取秒数。

  15. getNano():获取纳秒数。

二、日期格式化类

(一)、DateTimeFormatter:用于时间的格式化和解析
1、概述

        DateTimeFormatter是Java 8中的一个类,用于格式化日期和时间。它可以将日期和时间对象转换为指定格式的字符串,也可以将字符串转换为日期和时间对象。

2、常用方法:
static DateTimeFormatter ofPattern(格式)获取格式对象
String format(时间对象)按照指定方式格式化
// 获取格式对象
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));

// 解析/格式化器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");

// 格式化
System.out.println(dateTimeFormatter.format(zonedDateTime));

三、日历类

(一)、LocalDate:年、月、日   
              LocalTime:时、分、秒   
              LocalDateTime:年、月、日、时、分、秒
1、概述

        Java中的LocalDate是一个不可变的日期对象,代表了一个年月日的日期,不包含时间和时区信息。它是Java 8 API中的一部分,位于java.time包中。

        LocalDate类提供了许多方便的方法来处理日期、时间和时间间隔,例如加减天数、月份、年份、与其他日期比较等。它支持ISO日历系统(也就是公历)。

        LocalTime是Java 8中的时间API中的一种类型。它代表的是一个不带时区的时间,即仅表示时间部分,如小时、分钟、秒和毫秒。

        Java中的LocalDateTime是一个表示日期和时间,但没有时区偏移的类。它可以用于存储日期和时间的信息,例如:2021年8月15日下午3点30分。它不包含时区信息,所以它无法表示特定时区的时间。

2、常用方法:
static XXX now()获取当前时间的对象
static XXX of(...)获取指定时间的对象
get开头的方法获取日历中的年,月,日,时,分,秒等信息
isBefore,isAfter比较两个LocalDate
with开头修改时间
minus开头减少时间
plus开头增加时间
public LocalDate toLocalDate()LocalDateTiem转换成一个LocaDate对象
public LocalTime toLocalTime()LocalDateTiem转换成一个LocaTime对象
// 只演示LocalDate
// 获取当前时间的对象
LocalDate date = LocalDate.now();
System.out.println(date); // 2023-12-12

// 获取指定时间的对象
LocalDate localDate = LocalDate.of(2023, 1, 1);
System.out.println(localDate); // 2023-01-01

// 获取日历中的年,月,日,时,分,秒等信息
int year = localDate.getYear();
System.out.println(year);// 2023

// 获取月
Month m = localDate.getMonth();
System.out.println(m); // JANUARY
System.out.println(m.getValue()); // 1

int value = localDate.getMonthValue();
System.out.println(value);// 1

// 比较两个LocalDate
System.out.println(localDate.isBefore(localDate));
System.out.println(localDate.isAfter(localDate));

// 修改时间
LocalDate withYear = localDate.withYear(2000);
System.out.println(withYear); // 2000-01-01

// 减少时间
LocalDate minusYears = localDate.minusYears(1);
System.out.println(minusYears); // 2022-01-01

// 增加时间
LocalDate plusYears = localDate.plusYears(1);
System.out.println(plusYears); // 2024-01-01

四、工具类

(一)、Duration:时间间隔(秒,纳秒)
1、概述

Java中的Duration是一个类,用于表示时间段的长度,以时间的标准单位表示,如小时、分钟、秒、毫秒等。它可以用于计算时间间隔,比较时间间隔的大小,以及在时间上进行加减运算等。

2、常用方法:
  1. ofXXX()方法:根据不同的单位创建Duration对象。
  2. plusXXX()方法和minusXXX()方法:用于添加和减去时间间隔。
  3. toXXX()方法:将Duration对象转换为指定单位的时间间隔。
  4. compareTo()方法:比较两个Duration对象的大小。
  5. getXXX()方法:获取Duration对象的属性值,例如hours、minutes、seconds等
Duration duration1 = Duration.ofSeconds(60); // 创建一个持续时间为60秒的Duration对象
Duration duration2 = Duration.ofMinutes(5); // 创建一个持续时间为5分钟的Duration对象
 
Duration duration3 = Duration.ofSeconds(30);
Duration duration4 = duration3.plusSeconds(10); // 将持续时间增加10秒
Duration duration5 = duration3.minusSeconds(10); // 将持续时间减少10秒
 
Duration duration6 = Duration.ofMinutes(5);
long seconds = duration6.toSeconds(); // 将持续时间转换为秒数

Duration duration7 = Duration.ofSeconds(60);
Duration duration8 = Duration.ofMinutes(1);
int result = duration7.compareTo(duration8); // 比较持续时间是否相等


Duration duration9 = Duration.ofHours(2);
long hours = duration9.toHours(); // 获取持续时间的小时数

(二)、Period:时间间隔(年,月,日)
1、概述

        Java中的Period是表示两个日期之间的一段时间的类。它包含年、月、日等字段,可以用于计算两个日期之间的差值,也可以用于将一段时间加到日期上。Period类主要用于处理调整日期的情况,例如加上一个月、减去一年等。

2、常用方法:
  1. ofYears(int years): 创建一个表示指定年数的Period对象。
  2. ofMonths(int months): 创建一个表示指定月数的Period对象。
  3. ofDays(int days): 创建一个表示指定天数的Period对象。
  4. between(LocalDate startDateInclusive, LocalDate endDateExclusive): 创建一个表示两个日期之间的Period对象。
  5. getYears(), getMonths(), getDays(): 获取Period对象中的年、月、日等字段的值。
  6. plusYears(long yearsToAdd), plusMonths(long monthsToAdd), plusDays(long daysToAdd): 将指定的年、月、日数加到Period对象上。
  7. minusYears(long yearsToSubtract), minusMonths(long monthsToSubtract), minusDays(long daysToSubtract): 将指定的年、月、日数从Period对象上减去。
// 创建Period对象
Period period = Period.between(LocalDate.of(2019, 1, 1), LocalDate.now());
System.out.println(period.getYears() + " years " + period.getMonths() + " months " + period.getDays() + " days");

// 在日期上加上一段时间
LocalDate date = LocalDate.of(2022, 1, 1);
Period nextYear = Period.ofYears(1);
LocalDate nextDate = date.plus(nextYear);
System.out.println("Next year is " + nextDate);
 

(三)、ChronoUnit:时间间隔(所有单位)
1、概述

        ChronoUnit是Java 8中java.time包中的一个枚举类,表示一种时间单位。它提供了一组时间单位常量,用于在LocalDate、LocalTime、LocalDateTime和ZonedDateTime中执行日期或时间计算。

ChronoUnit中的常量包括:

  • NANOS:纳秒
  • MICROS:微秒
  • MILLIS:毫秒
  • SECONDS:秒
  • MINUTES:分钟
  • HOURS:小时
  • HALF_DAYS:半天
  • DAYS:天
  • WEEKS:周
  • MONTHS:月
  • YEARS:年
  • DECADES:十年
  • CENTURIES:世纪
  • MILLENNIA:千年
  • ERAS:时代
2、常用方法:
  1. between方法:计算两个日期或时间之间的差距,返回值为long类型。
  2. addTo方法:将指定的时间段添加到日期或时间中。
  3. isSupportedBy方法:判断指定的日期或时间是否支持指定的时间单位。
  4. getDuration方法:获取指定时间单位的持续时间。
  5. valueOf方法:根据字符串返回对应的ChronoUnit枚举常量。
LocalDate d1 = LocalDate.of(2022, 1, 1);
LocalDate d2 = LocalDate.of(2022, 1, 10);
long daysBetween = ChronoUnit.DAYS.between(d1, d2);
System.out.println("daysBetween: " + daysBetween); // 输出:9

LocalDate date = LocalDate.of(2022, 1, 1);
LocalDate newDate = date.plus(1, ChronoUnit.WEEKS);
System.out.println("newDate: " + newDate); // 输出:2022-01-08

LocalDate date = LocalDate.of(2022, 1, 1);
boolean isSupported = ChronoUnit.HOURS.isSupportedBy(date);
System.out.println("isSupported: " + isSupported); // 输出:false

Duration dayDuration = ChronoUnit.DAYS.getDuration();
System.out.println("dayDuration: " + dayDuration); // 输出:PT24H

ChronoUnit unit = ChronoUnit.valueOf("MONTHS");
System.out.println("unit: " + unit); // 输出:MONTHS
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值