本文大纲
一、时间日期类
二、年月日
三、时区
四、时间段
五、日期格式化
六、时间调整
七、时钟
java.time.chrono包:此包定义非ISO日历系统的通用API。我们可以扩展AbstractChronology类来创建我们自己的日历系统。
java.time.format包:此包包含用于格式化和解析日期时间对象的类。大多数情况下,我们不会直接使用它们,因为java.time包中的主要类提供了格式化和解析方法。
java.time.temporal包:此包包含临时对象,我们可以使用它来查找与日期/时间对象相关的特定日期或时间。例如,我们可以使用这些来查找该月的第一天或最后一天。您可以轻松识别这些方法,因为它们始终具有“withXXX”格式。
java.time.zone包:此包包含用于支持不同时区及其规则的类。
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 | now | 根据当前时间创建LocalDate对象 |
2 | of | 根据指定年月日创建LocalDate对象 |
3 | getYear | 获得年份 |
4 | getMonthValue | 获得月份 |
5 | getMonth | 获得月份枚举值 |
6 | getDayOfMonth | 获得月份天数(1-31) |
7 | getDayOfWeek | 获得星期几 |
8 | getDayOfYear | 获得年份中的第几天(1-366) |
9 | lengthOfYear | 获得当年总天数 |
10 | lengthOfMonth | 获得当月总天数 |
11 | toEpochDay | 与时间纪元(1970年1月1日)相差的天数 |
12 | plusDays | 加天 |
13 | plusWeeks | 加周 |
14 | plusMonths | 加月 |
15 | plusYears | 加年 |
16 | minusDays | 减年 |
17 | minusWeeks | 减周 |
18 | minusMonths | 减月 |
19 | minusYears | 减年 |
20 | withYear | 替换年份 |
21 | withYear | 替换年份 |
22 | withDayOfMonth | 替换日期 |
23 | withDayOfYear | 替换日期 |
24 | isBefore | 是否日期在之前 |
25 | isAfter | 是否日期在之后 |
26 | isEqual | 是否是当前日期 |
27 | isleapYear | 是否是闰年 |
//(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());
//(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));
//(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));
//(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());
//(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);
//(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 | static LocalTime now() | 获取默认时区的当前时间 |
2 | static LocalTime now(ZoneId zone) | 获取指定时区的当前时间 |
3 | static LocalTime now(Clock clock) | 从指定时钟获取当前时间 |
4 | of | 根据指定的时、分、秒获取LocalTime 实例 |
5 | getHour | 获取小时字段 |
6 | getMinute | 获取分钟字段 |
7 | getSecond | 获取秒字段 |
8 | getNano | 获取纳秒字段 |
9 | plusHours | 增加小时数 |
11 | plusMinutes | 增加分钟数 |
11 | plusSeconds | 增加秒数 |
12 | plusNanos | 增加纳秒数 |
13 | minusHours | 减少小时数 |
14 | minusMinutes | 减少分钟数 |
15 | minusSeconds | 减少秒数 |
16 | minusNanos | 减少纳秒数 |
17 | compareTo | 时间与另一个时间比较 |
18 | isAfter | 检查时间是否在指定时间之后 |
19 | isBefore | 检查时间是否在指定时间之前 |
//(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());
//(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));
//(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 | static LocalDateTime now() | 获取默认时区的当前日期时间 |
2 | static LocalDateTime now(Clock clock) | 从指定时钟获取当前日期时间 |
3 | static LocalDateTime now(ZoneId zone) | 获取指定时区的当前日期时间 |
4 | static LocalDateTime of(LocalDate date, LocalTime time) | 根据日期和时间对象获取LocalDateTime 实例 |
5 | static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) | 根据指定的年、月、日、时、分、秒获取LocalDateTime 实例 |
6 | getYear | 获取年份 |
7 | getMonth | 使用月份枚举类获取月份 |
8 | getDayOfMonth | 获取日期在该月是第几天 |
9 | getDayOfWeek | 获取日期是星期几 |
10 | getDayOfYear | 获取日期在该年是第几天 |
11 | getHour | 获取小时 |
12 | getMinute | 获取分钟 |
13 | getSecond | 获取秒 |
14 | getNano | 获取纳秒 |
15 | plusYears | 增加年 |
16 | plusMonths | 增加月 |
17 | plusWeeks | 增加周 |
18 | plusDays | 增加天 |
19 | plusHours | 增加小时 |
20 | plusMinutes | 增加分 |
21 | plusSeconds | 增加秒 |
22 | plusNanos | 增加纳秒 |
23 | minusYears | 减少年 |
24 | minusMonths | 减少月 |
25 | meminusWeeks | 减少周 |
26 | minusDays | 减少天 |
27 | minusHours | 减少小时 |
28 | minusMinutes | 减少分 |
29 | minusSeconds | 减少秒 |
30 | minusNanos | 减少纳秒 |
31 | isEqual | 判断日期时间是否相等 |
32 | isBefore | 检查是否在指定日期时间之前 |
33 | isAfter | 检查是否在指定日期时间之后 |
//(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());
//(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));
//(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()));
// 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:计算日期和时间差
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());
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());
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);
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类,为常用的时间调节器
序号 | 调节器 | 作用 |
---|---|---|
1 | dayOfWeekInMonth | 同一个月中每一周的第几天 |
2 | firstDayOfMonth | 当月的第一天 |
3 | firstDayOfNextMonth | 下月的第一天 |
4 | firstDayOfNextYear | 明年的第一天 |
5 | firstDayOfYear | 当年的第一天 |
6 | firstInMonth | 同一个月中,第一个符合星期几要求的值 |
7 | lastDayOfMonth | 当月的最后一天 |
8 | lastDayOfNextMonth | 下月的最后一天 |
9 | lastDayOfNextYear | 明年的最后一天 |
10 | lastDayOfYear | 今年的最后一天 |
11 | lastInMonth | 同一个月中,最后一个符合星期几要求的值 |
dayOfWeekInMonth 同一个月中每一周的第几天
firstDayOfMonth 当月的第一天
firstDayOfNextMonth 下月的第一天
firstDayOfNextYear 明年的第一天
firstDayOfYear 当年的第一天
firstInMonth 同一个月中,第一个符合星期几要求的值
lastDayOfMonth 当月的最后一天
lastDayOfNextMonth 下月的最后一天
lastDayOfNextYear 明年的最后一天
lastDayOfYear 今年的最后一天
lastInMonth 同一个月中,最后一个符合星期几要求的值
next/previous 将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期
nextOrSame/previousOrSame 将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,直接返回该对象
Clock: 用于访问当前时刻、日期、时间,用到时区,比如获取目前美国纽约的时间
ZoneOffset:时区偏移量,比如:+8:00