java8的时间增强类分类详解

java8的时间增强类分类详解

本文大纲
一、时间日期类
二、年月日
三、时区
四、时间段
五、日期格式化
六、时间调整
七、时钟

Java 8 Date Time API包

java.time包:这是新的Java Date Time API的基础包。所有主要的基类是该计划的一部分,比如LocalDate,LocalTime,LocalDateTime,Instant,Period,Duration等所有这些类是不可变的和线程安全的。大多数情况下,这些类足以满足常见要求。

java.time.chrono包:此包定义非ISO日历系统的通用API。我们可以扩展AbstractChronology类来创建我们自己的日历系统。

java.time.format包:此包包含用于格式化和解析日期时间对象的类。大多数情况下,我们不会直接使用它们,因为java.time包中的主要类提供了格式化和解析方法。

java.time.temporal包:此包包含临时对象,我们可以使用它来查找与日期/时间对象相关的特定日期或时间。例如,我们可以使用这些来查找该月的第一天或最后一天。您可以轻松识别这些方法,因为它们始终具有“withXXX”格式。

java.time.zone包:此包包含用于支持不同时区及其规则的类。

方法前缀的含义,统一了api

of:静态工厂方法(用类名去调用)。
parse:静态工厂方法,关注于解析(用类名去调用)。
now: 静态工厂方法,用当前时间创建实例(用类名去调用)
get:获取某些东西的值。
is:检查某些东西的是否是true。
with:返回一个部分状态改变了的时间日期对象拷贝(单独一个with方法,参数为TemporalAdjusters类型)。
plus:返回一个时间增加了的、时间日期对象拷贝(如果参数是负数也能够有minus方法的效果)。
minus:返回一个时间减少了的、时间日期对象拷贝。
to:把当前时间日期对象转换成另外一个,可能会损失部分状态。
at:把这个对象与另一个对象组合起来,例如: date.atTime(time)。
format :根据某一个DateTimeFormatter格式化为字符串。

一、时间日期类

LocalDate 不可变的类,该类代表不带时区的日期,如:2019-02-24
LocalTime 不可变的类,该类代表不带时区的时间,如:10:20:09
LocalDateTime 不可变的类,该类代表不带时区的日期、时间,如:2019-02-24T10:20:09

1.1、LocalDate(年月日)详解

序号方法描述
1now根据当前时间创建LocalDate对象
2of根据指定年月日创建LocalDate对象
3getYear获得年份
4getMonthValue获得月份
5getMonth获得月份枚举值
6getDayOfMonth获得月份天数(1-31)
7getDayOfWeek获得星期几
8getDayOfYear获得年份中的第几天(1-366)
9lengthOfYear获得当年总天数
10lengthOfMonth获得当月总天数
11toEpochDay与时间纪元(1970年1月1日)相差的天数
12plusDays加天
13plusWeeks加周
14plusMonths加月
15plusYears加年
16minusDays减年
17minusWeeks减周
18minusMonths减月
19minusYears减年
20withYear替换年份
21withYear替换年份
22withDayOfMonth替换日期
23withDayOfYear替换日期
24isBefore是否日期在之前
25isAfter是否日期在之后
26isEqual是否是当前日期
27isleapYear是否是闰年

(1)获取

//(1)获取当前日期 2022-07-07
System.out.println(LocalDate.now());

//(2)获取指定日期 2000-03-05
System.out.println(LocalDate.of(2014, 3, 5));

//(3)获取日期的年份 2022
System.out.println(LocalDate.now().getYear());

//(4)获取日期的月份 7
System.out.println(LocalDate.now().getMonthValue());

//(5)获取日期的日子 7
System.out.println(LocalDate.now().getDayOfMonth());

//(6)获取日期的星期 THURSDAY
System.out.println(LocalDate.now().getDayOfWeek());

//(7)当天所在这一年的第几天 188
System.out.println(LocalDate.now().getDayOfYear());

//(8)获取当年天数 365
System.out.println(LocalDate.now().lengthOfYear());

//(9)获取当月天数 31
System.out.println(LocalDate.now().lengthOfMonth());

//(10)与时间纪元(1970年1月1日)相差的天数,负数表示在时间纪元之前多少天 19180
System.out.println(LocalDate.now().toEpochDay());

(2)运算

//(1)加一天
System.out.println("加1天:" + LocalDate.now().plusDays(1));

//(2)加一周
System.out.println("加1周:" + LocalDate.now().plusWeeks(1));

//(3)加一月
System.out.println("加1月:" + LocalDate.now().plusMonths(1));

//(4)加一年
System.out.println("加1年:" + LocalDate.now().plusYears(1));

//(5)减一天
System.out.println("减1天:" + LocalDate.now().minusDays(1));

//(6)减一周
System.out.println("减1周:" + LocalDate.now().minusWeeks(1));

//(7)减一月
System.out.println("减1月:" + LocalDate.now().minusMonths(1));

//(8)减一年
System.out.println("减1年:" + LocalDate.now().minusYears(1));

(3)替换

//(1)替换年份:2000-07-07
System.out.println("替换年份为2000:" + LocalDate.now().withYear(2000));

//(2)替换月份:2020-01-07
System.out.println("替换月份为1:" + LocalDate.now().withMonth(1));

//(3)替换日子:2020-07-01
System.out.println("替换日期为1:" + LocalDate.now().withDayOfMonth(1));

//(4)替换天数:一年中的第多少天
System.out.println("替换天数为1:" + LocalDate.now().withDayOfYear(1));

(4)比较

//(1)是否在当天之前
System.out.println("是否在当天之前:" + LocalDate.now().minusDays(1).isBefore(LocalDate.now()));

//(2)是否在当天之后
System.out.println("是否在当天之后:" + LocalDate.now().plusDays(1).isAfter(LocalDate.now()));

//(3)是否在当天
System.out.println("是否在当天:" + LocalDate.now().isEqual(LocalDate.now()));

//(4)是否是闰年
System.out.println("今年是否是闰年:" + LocalDate.now().isLeapYear());

(5)LocalDate 与 String 之间的转换

//(1)从文本字符串获取LocalDate实例
LocalDate localdate = LocalDate.parse("2022-04-21");

System.out.println(localdate);

//(2)使用特定格式化形式从文本字符串获取LocalDate实例
String str = "2019-03-03";

DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

LocalDate date = LocalDate.parse(str, fmt1);

System.out.println(date);

//(3)使用特定格式化形式将LocalDate转为字符串
LocalDate today = LocalDate.now();

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");

String dateStr = today.format(fmt);

System.out.println(dateStr);

(6)LocalDate 与 Date之间的转换

//(1)LocalDate转化为Date
ZonedDateTime zonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault());

Date date = Date.from(zonedDateTime.toInstant());

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));

//(2)Date转化为LocalDate
LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

System.out.println(localDate.format(DateTimeFormatter.ISO_LOCAL_DATE));

1.2、LocalTime(时分秒)详解

序号方法描述
1static LocalTime now()获取默认时区的当前时间
2static LocalTime now(ZoneId zone)获取指定时区的当前时间
3static LocalTime now(Clock clock)从指定时钟获取当前时间
4of根据指定的时、分、秒获取LocalTime 实例
5getHour获取小时字段
6getMinute获取分钟字段
7getSecond获取秒字段
8getNano获取纳秒字段
9plusHours增加小时数
11plusMinutes增加分钟数
11plusSeconds增加秒数
12plusNanos增加纳秒数
13minusHours减少小时数
14minusMinutes减少分钟数
15minusSeconds减少秒数
16minusNanos减少纳秒数
17compareTo时间与另一个时间比较
18isAfter检查时间是否在指定时间之后
19isBefore检查时间是否在指定时间之前

(1)获取

//(1)获取默认时区的当前时间 14:11:31.294
System.out.println(LocalTime.now());

//(2)获取指定时区的当前时间 14:11:31.392
System.out.println(LocalTime.now(ZoneId.of("Asia/Shanghai")));

//(3)从指定时钟获取当前时间 14:11:31.392
System.out.println(LocalTime.now(Clock.systemDefaultZone()));

//(4)指定获取时分秒
System.out.println(LocalTime.of(12, 30, 30));

//(5)指定获取时分
System.out.println(LocalTime.of(12, 30));

//(6)指定获取时分秒纳秒
System.out.println(LocalTime.of(12, 30, 30, 123));

//(7)获取小时字段
System.out.println("时: " + LocalTime.now().getHour());

//(8)获取分钟字段
System.out.println("分: " + LocalTime.now().getMinute());

//(9)获取秒字段
System.out.println("秒: " + LocalTime.now().getSecond());

//(10)获取纳秒字段
System.out.println("纳秒: " + LocalTime.now().getNano());

(2)计算

//(1)增加一小时
System.out.println("增加1小时: " + LocalTime.now().plusHours(1));

//(2)增加三十分钟
System.out.println("增加30分钟: " + LocalTime.now().plusMinutes(30));

//(3)增加三十秒
System.out.println("增加30秒: " + LocalTime.now().plusSeconds(30));

//(4)增加一万纳秒
System.out.println("增加10000纳秒:" + LocalTime.now().plusNanos(10000));

//(5)减少一小时
System.out.println("减少1小时: " + LocalTime.now().minusHours(1));

//(6)减少三十分钟
System.out.println("减少30分钟: " + LocalTime.now().minusMinutes(30));

//(7)减少三十秒
System.out.println("减少30秒: " + LocalTime.now().minusSeconds(30));

//(8)减少一万纳秒
System.out.println("减少10000纳秒:" + LocalTime.now().minusNanos(10000));

(3)比较

//(1)时间与另一个时间比较 0(相等)正数(大)负数(小)
System.out.println(LocalTime.now().compareTo(LocalTime.now()));

//(2)检查时间是否在指定时间之后
System.out.println(LocalTime.now().isAfter(LocalTime.now()));

//(3)检查时间是否在指定时间之前
System.out.println(LocalTime.now().isBefore(LocalTime.now()));

1.3、LocalDateTime(年月日时分秒)详解

序号方法描述
1static LocalDateTime now()获取默认时区的当前日期时间
2static LocalDateTime now(Clock clock)从指定时钟获取当前日期时间
3static LocalDateTime now(ZoneId zone)获取指定时区的当前日期时间
4static LocalDateTime of(LocalDate date, LocalTime time)根据日期和时间对象获取LocalDateTime 实例
5static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)根据指定的年、月、日、时、分、秒获取LocalDateTime 实例
6getYear获取年份
7getMonth使用月份枚举类获取月份
8getDayOfMonth获取日期在该月是第几天
9getDayOfWeek获取日期是星期几
10getDayOfYear获取日期在该年是第几天
11getHour获取小时
12getMinute获取分钟
13getSecond获取秒
14getNano获取纳秒
15plusYears增加年
16plusMonths增加月
17plusWeeks增加周
18plusDays增加天
19plusHours增加小时
20plusMinutes增加分
21plusSeconds增加秒
22plusNanos增加纳秒
23minusYears减少年
24minusMonths减少月
25meminusWeeks减少周
26minusDays减少天
27minusHours减少小时
28minusMinutes减少分
29minusSeconds减少秒
30minusNanos减少纳秒
31isEqual判断日期时间是否相等
32isBefore检查是否在指定日期时间之前
33isAfter检查是否在指定日期时间之后

(1)获取

//(1)获取默认时区的当前日期时间
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

//(2)获取指定时区的当前日期时间
System.out.println(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));

//(3)从指定时钟获取当前日期时间
System.out.println(LocalDateTime.now(Clock.systemDefaultZone()));

//(4)根据日期和时间对象获取LocalDateTime实例
System.out.println(LocalDateTime.of(LocalDate.now(), LocalTime.now()));

//(5)根据指定的年、月、日、时、分、秒获取LocalDateTime实例
System.out.println(LocalDateTime.of(2019, 12, 7, 21, 48, 50));

//(6)获取年份
System.out.println("年 : " + LocalDateTime.now().getYear());

//(7)使用月份枚举类获取月份
System.out.println("月(英文) : " + LocalDateTime.now().getMonth());

//(8) 使用月份数字类获取月份
System.out.println(" 月(数字英文): " + LocalDateTime.now().getMonth().getValue());

//(9)获取日期在该月是第几天
System.out.println("天 : " + LocalDateTime.now().getDayOfMonth());

//(10)获取日期是星期几(英文)
System.out.println("星期几(英文) : " + LocalDateTime.now().getDayOfWeek());

//(11)获取日期是星期几(数字英文)
System.out.println("星期几(数字英文) : " + LocalDateTime.now().getDayOfWeek().getValue());

//(12)获取日期在该年是第几天
System.out.println("本年的第几天 : " + LocalDateTime.now().getDayOfYear());

//(13)获取小时
System.out.println("时: " + LocalDateTime.now().getHour());

//(14)获取分钟
System.out.println("分: " + LocalDateTime.now().getMinute());

//(15)获取秒
System.out.println("秒: " + LocalDateTime.now().getSecond());

//(16)获取纳秒
System.out.println("纳秒: " + LocalDateTime.now().getNano());

(2)计算

//(1)增加天数
System.out.println("增加天数 : " + LocalDateTime.now().plusDays(1));

//(2)增加周数
System.out.println("增加周数 : " + LocalDateTime.now().plusWeeks(1));

//(3)增加月数
System.out.println("增加月数 : " + LocalDateTime.now().plusMonths(1));

//(4)增加年数
System.out.println("增加年数 : " + LocalDateTime.now().plusYears(1));

//(5)减少天数
System.out.println("减少天数 : " + LocalDateTime.now().minusDays(1));

//(6)减少月数
System.out.println("减少月数 : " + LocalDateTime.now().minusMonths(1));

//(7)减少周数
System.out.println("减少周数 : " + LocalDateTime.now().minusWeeks(1));

//(8)减少年数
System.out.println("减少年数 : " + LocalDateTime.now().minusYears(1));

//(9)增加小时
System.out.println("增加1小时: " + LocalDateTime.now().plusHours(1));

//(10)增加分钟
System.out.println("增加30分钟: " + LocalDateTime.now().plusMinutes(30));

//(11)增加秒数
System.out.println("增加30秒: " + LocalDateTime.now().plusSeconds(30));

//(12)增加纳秒
System.out.println("增加10000纳秒:" + LocalDateTime.now().plusNanos(10000));

//(13)减少小时
System.out.println("减少1小时:" + LocalDateTime.now().minusHours(1));

//(14)减少分钟
System.out.println("减少30分钟:" + LocalDateTime.now().minusMinutes(30));

//(15)减少秒数
System.out.println("减少30秒: " + LocalDateTime.now().minusSeconds(30));

//(16)减少纳秒
System.out.println("减少10000纳秒:" + LocalDateTime.now().minusNanos(10000));

(3)比较

//(1)判断日期时间是否相等
System.out.println(LocalDateTime.now().isEqual(LocalDateTime.now()));

//(2)检查是否在指定日期时间之前
System.out.println(LocalDateTime.now().isBefore(LocalDateTime.now()));

//(3)检查是否在指定日期时间之后
System.out.println(LocalDateTime.now().isAfter(LocalDateTime.now()));

(4)LocalDateTime与Date互转

// Date 转化成 LocalDateTime
  public static LocalDateTime dateToLocalDate(Date date) {
    //Date转纳秒
    Instant instant = date.toInstant();
    //获取系统默认的时区
    ZoneId zoneId = ZoneId.systemDefault();
    //转化
    return instant.atZone(zoneId).toLocalDateTime();
  }

// LocalDateTime 转化成 Date
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
    ZoneId zoneId = ZoneId.systemDefault();
    ZonedDateTime zdt = localDateTime.atZone(zoneId);
    return Date.from(zdt.toInstant());
}

// Date 毫秒数据 转化成 LocalDateTime
public static LocalDateTime dateToLocalDateMil(Long datemilli) {
   //将毫秒数据转化为纳秒
   Instant instant = Instant.ofEpochMilli(datemilli);
   ZoneId zoneId = ZoneId.systemDefault();
   return instant.atZone(zoneId).toLocalDateTime();
 }

二、年月日

Year:该类仅代表年,如:2019
YearMonth:该类仅代表年月 如:2019-02
MonthDay:该类仅代表月日,如:09-20
Month:该类是一个枚举类,定义了一月到十二月的枚举值
DayOfWeek:该类是一个枚举类,定义了周日到周六的枚举值

三、时区

ZonedDateTime:该类代表一个时区化的日期、时间 如:2022-01-09T19:50:54.751+08:00[Asia/Shanghai]
ZonedId:该类代表一个时区 Asia/Shanghai
Instant:不可变的类,代表时间戳,精确到纳秒 2022-01-09T11:52:37.879Z

四、时间段

Period:一段日期 
Duration:一段时间
Chronounit:时间单位
Until:计算日期和时间差

4.1、Period(一段日期)

period的单位是year, month 和day

LocalDate startTime = LocalDate.now();
System.out.println("startTime : " + startTime);
LocalDate endTime = LocalDate.now().plusMonths(18);
System.out.println("endTime : " + endTime);

Period p = Period.between(startTime, endTime);
System.out.printf("时间间隔 : %d 年", p.getYears());
System.out.printf("时间间隔 : %d 月 ",p.getMonths());
System.out.printf("时间间隔 : %d 日", p.getDays());
System.out.printf("时间间隔 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());

4.2、Duration(一段时间)

duration主要用来衡量秒级和纳秒级的时间,使用于时间精度要求比较高的情况。

LocalDateTime startTime = LocalDateTime.now();
System.out.println("startTime : " + startTime);
LocalDateTime endTime = LocalDateTime.now().plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);
System.out.println("endTime : " + endTime);

Duration between = Duration.between(startTime, endTime);
System.out.println("日 "+between.toDays());
System.out.println("时 "+between.toHours());
System.out.println("分 "+between.toMinutes());
System.out.println("秒 "+between.getSeconds());
System.out.println("毫秒"+between.toMillis());

4.3、Chronounit(时间单位)

ChronoUnit 是用来表示时间单位的,但是也提供了一些非常有用的between方法来计算两个时间的差值:

LocalDateTime startTime = LocalDateTime.now();
System.out.println("startTime : " + startTime);
LocalDateTime endTime = LocalDateTime.now().plusYears(1).plusMonths(1)
        .plusWeeks(1).plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);
System.out.println("endTime : " + endTime);

long years = ChronoUnit.YEARS.between(startTime, endTime);
System.out.println("日 "+years);
long months = ChronoUnit.MONTHS.between(startTime,endTime);
System.out.println("月 "+months);
long weeks = ChronoUnit.WEEKS.between(startTime,endTime);
System.out.println("周 "+weeks);
long days = ChronoUnit.DAYS.between(startTime,endTime);
System.out.println("日 "+days);
long hours = ChronoUnit.HOURS.between(startTime,endTime);
System.out.println("时 "+hours);
long minutes = ChronoUnit.MINUTES.between(startTime,endTime);
System.out.println("分 "+minutes);
long seconds = ChronoUnit.SECONDS.between(startTime,endTime);
System.out.println("秒 "+seconds);
long millis = ChronoUnit.MILLIS.between(startTime,endTime);
System.out.println("月 "+months);

4.4、Until(时间单位)

until同 四.ChronoUnit类一样,计算有年、月、周、日、时、分、秒、毫秒
计算的是LocalDate和LocalDateTime两个时间分别间隔的年、月、周、日、时、分、秒、毫秒

LocalDateTime startTime = LocalDateTime.now();
System.out.println("startTime : " + startTime);
LocalDateTime endTime = LocalDateTime.now().plusYears(1).plusMonths(1)
        .plusWeeks(1).plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);
System.out.println("endTime : " + endTime);

long years = startTime.until(endTime, ChronoUnit.YEARS);
System.out.println("日 "+years);
long months = startTime.until(endTime, ChronoUnit.MONTHS);
System.out.println("月 "+months);
long weeks = startTime.until(endTime, ChronoUnit.WEEKS);
System.out.println("周 "+weeks);
long days = startTime.until(endTime, ChronoUnit.DAYS);
System.out.println("日 "+days);
long hours = startTime.until(endTime, ChronoUnit.HOURS);
System.out.println("时 "+hours);
long minutes = startTime.until(endTime, ChronoUnit.MINUTES);
System.out.println("分 "+minutes);
long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
System.out.println("秒 "+seconds);
long millis = startTime.until(endTime, ChronoUnit.MILLIS);
System.out.println("月 "+months);

五、日期格式化

DateTimeFormatter:可以格式化日期时间,线程安全

六、时间调节器

TemporalAdjuster是一个函数式接口,用来调节时间。
TemporalAdjusters是一个final类,为常用的时间调节器
序号调节器作用
1dayOfWeekInMonth同一个月中每一周的第几天
2firstDayOfMonth当月的第一天
3firstDayOfNextMonth下月的第一天
4firstDayOfNextYear明年的第一天
5firstDayOfYear当年的第一天
6firstInMonth同一个月中,第一个符合星期几要求的值
7lastDayOfMonth当月的最后一天
8lastDayOfNextMonth下月的最后一天
9lastDayOfNextYear明年的最后一天
10lastDayOfYear今年的最后一天
11lastInMonth同一个月中,最后一个符合星期几要求的值

TemporalAdjusters 调节器常用方法

dayOfWeekInMonth   同一个月中每一周的第几天
firstDayOfMonth     当月的第一天
firstDayOfNextMonth   下月的第一天
firstDayOfNextYear   明年的第一天
firstDayOfYear     当年的第一天
firstInMonth      同一个月中,第一个符合星期几要求的值
lastDayOfMonth     当月的最后一天
lastDayOfNextMonth   下月的最后一天
lastDayOfNextYear   明年的最后一天
lastDayOfYear   今年的最后一天
lastInMonth   同一个月中,最后一个符合星期几要求的值
next/previous  将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期
nextOrSame/previousOrSame 将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,直接返回该对象

七、时钟

Clock: 用于访问当前时刻、日期、时间,用到时区,比如获取目前美国纽约的时间
ZoneOffset:时区偏移量,比如:+8:00
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值