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、常用方法:
now():返回当前时区的当前时间。
of():根据指定的年、月、日、小时、分钟、秒和时区创建一个 ZonedDateTime 对象。
toInstant():将 ZonedDateTime 对象转换为 Instant 对象,即从时区时间转为标准时间。
withZoneSameInstant():根据指定时区,将 ZonedDateTime 对象转换为同一时刻的另一个时区时间。
withZoneSameLocal():根据指定时区,将 ZonedDateTime 对象转换为同一本地时间的另一个时区时间。
toLocalDateTime():将 ZonedDateTime 对象转换为 LocalDateTime 对象,即去掉时区信息。
format():格式化 ZonedDateTime 对象为指定格式的时间字符串。
getYear():获取年份。
getMonth():获取月份。
getDayOfMonth():获取日期。
getDayOfWeek():获取星期几。
getHour():获取小时。
getMinute():获取分钟。
getSecond():获取秒数。
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、常用方法:
- ofXXX()方法:根据不同的单位创建Duration对象。
- plusXXX()方法和minusXXX()方法:用于添加和减去时间间隔。
- toXXX()方法:将Duration对象转换为指定单位的时间间隔。
- compareTo()方法:比较两个Duration对象的大小。
- 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、常用方法:
- ofYears(int years): 创建一个表示指定年数的Period对象。
- ofMonths(int months): 创建一个表示指定月数的Period对象。
- ofDays(int days): 创建一个表示指定天数的Period对象。
- between(LocalDate startDateInclusive, LocalDate endDateExclusive): 创建一个表示两个日期之间的Period对象。
- getYears(), getMonths(), getDays(): 获取Period对象中的年、月、日等字段的值。
- plusYears(long yearsToAdd), plusMonths(long monthsToAdd), plusDays(long daysToAdd): 将指定的年、月、日数加到Period对象上。
- 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、常用方法:
between
方法:计算两个日期或时间之间的差距,返回值为long类型。addTo
方法:将指定的时间段添加到日期或时间中。isSupportedBy
方法:判断指定的日期或时间是否支持指定的时间单位。getDuration
方法:获取指定时间单位的持续时间。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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!