目录
1、初始化
2、获取指定时间
3、时间操作
4、获取时间属性值
5、时间格式之间相互转换
5.1、LocalDateTime与String
5.2、时间戳与LocalDate、LocalDateTime之间相互转换
5.3、Date与LocalDate、LocalDateTime之间相互转换
5.4、Date与LocalDate、LocalDateTime之间相互转换
6、其他方法
7、时区
8、Instant(时间点)
LocalDateTime表示日期和时间,LocalDate用来表示日期,LocalTIme表示时间,LocalDateTime = LocalDate + LocalTIme。
System.out.println(LocalDate.now());
System.out.println(LocalTime.now());
System.out.println(LocalDateTime.now());
/*打印结果:
2020-04-02
11:29:52.206
2020-04-02T11:29:52.206
*/
LocalDateTime可以分别获取LocalDate和LocalTime:
(1)toLocalDate 返回LocalDateTime的LocalDate部分
(2)toLocalTime 返回LocalDateTime的LocalTime部分
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
LocalDate localDate = now.toLocalDate();
System.out.println(localDate);
LocalTime localTime = now.toLocalTime();
System.out.println(localTime);
/*打印结果:
2020-04-02T13:57:43.990
2020-04-02
13:57:43.990
*/
LocalTime.of(int hour,int minute,int second):指定时、分、秒,参数不可缺省
LocalDate.of(int year,int mouth,int day):指定年、月、日,参数不可缺省,这里指定月份的话是从1开始,与Calendar不同,Calendar的月份是从0开始,这也就是LocalDate比Calendar处理时间要方便的多。
LocalDate.of(int year,MOUTH mouth,int day)
LocalDateTime.of(nt year,int mouth,int day,int hour,int minute,int second,int nanoOfSecond):指定年、月、日、时、分、秒、纳秒,参数可缺省
LocalDateTime.of(nt year,MOUTH mouth,int day,int hour,int minute,int second,int nanoOfSecond)
LocalDateTime.of(LocalDate localDate,LocalTime localTime)
System.out.println(LocalDate.of(2020,12,1));
System.out.println(LocalDate.of(2020, Month.APRIL,23));
System.out.println(LocalTime.of(12,23,33));
System.out.println(LocalDateTime.of(LocalDate.now(),LocalTime.now()));
System.out.println(LocalDateTime.of(2322,12,22,23,12,33,232));
System.out.println(LocalDateTime.of(2322,Month.JULY,22,23,12,33,232));
/*打印结果:
2020-12-01
2020-04-23
12:23:33
2020-04-02T11:48:20.785
2322-12-22T23:12:33.000000232
2322-07-22T23:12:33.000000232
*/
这里以LocalDateTime进行举例说明
序号 | 函数 | 返回 | 描述 |
---|---|---|---|
1 | plus | LocalDateTime | 加上指定数量的时间得到的值 |
2 | plusDays | LocalDateTime | 加上指定天数得到的值 |
3 | plusHours | LocalDateTime | 加上指定小时数得到的值 |
4 | plusMinutes | LocalDateTime | 加上指定分钟数得到的值 |
5 | plusMonths | LocalDateTime | 加上指定月数得到的值 |
6 | plusNanos | LocalDateTime | 加上指定纳秒数得到的值 |
7 | plusSeconds | LocalDateTime | 加上指定秒数得到的值 |
8 | plusWeeks | LocalDateTime | 加上指定星期数得到的值 |
9 | plusYears | LocalDateTime | 加上指定年数得到的值 |
10 | with | LocalDateTime | 指定字段更改为新值后的拷贝 |
11 | withDayOfMonth | LocalDateTime | 月的第几天更改为新值后的拷贝 |
12 | withDayOfYear | LocalDateTime | 年的第几天更改为新值后的拷贝 |
13 | withHour | LocalDateTime | 小时数更改为新值后的拷贝 |
14 | withMinute | LocalDateTime | 分钟数更改为新值后的拷贝 |
15 | withMonth | LocalDateTime | 月份更改为新值后的拷贝 |
16 | withNano | LocalDateTime | 纳秒数更改为新值后的拷贝 |
17 | withSecond | LocalDateTime | 秒数更改为新值后的拷贝 |
18 | withYear | LocalDateTime | 年份更改为新值后的拷贝 |
说明:1、plus是增加相应时间单位的水量,minus是减少相应时间单位的数量,此处不再说明;
2、表中的拷贝实际就是对相应时间位置的数值进行修改。
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
System.out.println(now.plusYears(1)
.plusMonths(1L)
.plusWeeks(1)
.plusDays(1)
.plusHours(1)
.plusMinutes(1)
.plusSeconds(1)
.plusNanos(500000L));
/*打印结果:
2020-04-02T12:04:22.507
2021-05-10T13:05:23.507500
*/
System.out.println(now);
// 半天
System.out.println(now.plus(2, ChronoUnit.HALF_DAYS));
// 世纪
System.out.println(now.plus(2, ChronoUnit.CENTURIES));
// 十年
System.out.println(now.plus(2, ChronoUnit.DECADES));
// 千年,执行不成功
System.out.println(now.plus(2, ChronoUnit.MILLENNIA));
// 永恒,执行不成功
System.out.println(now.plus(1, ChronoUnit.FOREVER));
// 微秒,执行不成功
System.out.println(now.plus(1, ChronoUnit.MICROS));
// 时代,执行不成功
System.out.println(now.plus(1, ChronoUnit.ERAS));
LocalDate date = LocalDate.of(2020, 2, 22); // 2020-02-22
LocalDate date1 = date.withYear(2021); // 修改为 2021-02-22
LocalDate date2 = date.withMonth(3); // 修改为 2020-03-22
LocalDate date3 = date.withDayOfMonth(1); // 修改为 2020-02-01
序号 | 函数 | 描述 |
---|---|---|
1 | get | 得到LocalDateTime的指定字段的值 |
2 | getDayOfMonth | 得到LocalDateTime是月的第几天 |
3 | getDayOfWeek | 得到LocalDateTime是星期几 |
4 | getDayOfYear | 得到LocalDateTime是年的第几天 |
5 | getHour | 得到LocalDateTime的小时 |
6 | getLong | 得到LocalDateTime指定字段的值 |
7 | getMinute | 得到LocalDateTime的分钟 |
8 | getMonth | 得到LocalDateTime的月份,获取的结果是月份的枚举值 |
9 | getMonthValue | 得到LocalDateTime的月份,从1到12 |
10 | getNano | 得到LocalDateTime的纳秒数 |
11 | getSecond | 得到LocalDateTime的秒数 |
12 | getYear | 得到LocalDateTime的年份 |
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒");
LocalDateTime localDateTime = LocalDateTime.now();
String dateStr = dateTimeFormatter.format(localDateTime);
System.out.println(dateStr); \\2020年04月02日 14时11分01秒623毫秒
LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
System.out.println(localDateTime2); \\ 2020-04-02T14:11:01.623
LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
System.out.println(localDate); \\2020-04-02
LocalTime localTime = LocalTime.parse(dateStr, dateTimeFormatter);
System.out.println(localTime); \\14:11:01.623
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(timestamp +"====>"+ localDateTime );
timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
System.out.println(localDateTime +"====>"+ timestamp );
// 注意秒和毫秒之间的区别
timestamp = LocalDateTime.now().atZone(ZoneOffset.ofHours(8)).toEpochSecond();
localDateTime = Instant.ofEpochSecond(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(timestamp +"====>"+ localDateTime );
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(date + "======>" + localDateTime);
/*打印结果:
2020-04-02T14:27:40.230
Thu Apr 02 14:27:40 CST 2020======>2020-04-02T14:27:40.230
*/
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(date + "======>" + localDateTime);
/*打印结果:
2020-04-02T14:27:40.230
Thu Apr 02 14:27:40 CST 2020======>2020-04-02T14:27:40.230
*/
序号 | 函数 | 描述 | 类别 |
---|---|---|---|
1 | atOffset | 结合LocalDateTime和ZoneOffset创建一个OffsetDateTime | 时区相关 |
2 | atZone | 结合LocalDateTime和指定时区创建一个ZonedDateTime | 时区相关 |
3 | ofEpochSecond | 根据秒数(从1970-01-0100:00:00开始)创建LocalDateTime | 实例方法 |
4 | ofInstant | 根据Instant和ZoneId创建LocalDateTime | 实例方法 |
5 | compareTo | 比较两个LocalDateTime,小于返回-1,等于返回0,大于返回1 | 比较方法 |
6 | isAfter | 判断LocalDateTime是否在指定LocalDateTime之后 | 比较方法 |
7 | isBefore | 判断LocalDateTime是否在指定LocalDateTime之前 | 比较方法 |
8 | isEqual | 判断两个LocalDateTime是否相等 | 比较方法 |
9 | format | 格式化LocalDateTime生成一个字符串 | 格式化方法 |
10 | from | 转换TemporalAccessor为LocalDateTime | 格式化方法 |
11 | parse | 解析字符串得到LocalDateTime | 格式化方法 |
12 | isSupported | 判断LocalDateTime是否支持指定时间字段或单元 | 其他 |
13 | toString | 返回LocalDateTime的字符串表示 | 其他 |
14 | range | 返回指定时间字段的数值范围范围(ChronoField) | 其他 |
15 | truncatedTo | 返回LocalDateTime截取到指定时间单位的拷贝,如果无法截断抛DateTimeException,如果不支持截断单位抛UnsupportedTemporalTypeException |
其他 |
16 | until | 计算LocalDateTime和另一个LocalDateTime之间的时间差,可以指定时间单位(ChronoUnit) | 其他 |
17 | adjustInto | 将目标对象调整为指定的时间对象,指定对象调用方法,目标对象作为参数 | 其他 |
18 | query | 使用指定的查询查询此日期时间,查询LocalDateTime(TemporalQueries) | 其他 |
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:" + now);
LocalDateTime from = LocalDateTime.of(2020, 4, 1, 0, 0, 0, 0);
System.out.println(from.until(now, ChronoUnit.HOURS));
/*打印结果:
当前时间:2020-04-03T14:40:39.048
62
*/
LocalDateTime date = LocalDateTime.parse("2014-12-03T10:15:30");
System.out.printf("LocalDateTime precision is %s%n",
zonedDateTime.query(TemporalQueries.precision()));
/*打印结果:
LocalDateTime precision is Nanos
*/
ZonedDateTime date = ZonedDateTime.now();
System.out.println(date);
LocalTime standard = LocalTime.parse("10:30:30");
date = (ZonedDateTime)standard.adjustInto(date);
System.out.println(date);
/*打印结果:
2020-04-03T15:03:31.579+08:00[Asia/Shanghai]
2020-04-03T10:30:30+08:00[Asia/Shanghai]
*/
对失去处理的优化也是java8中日期时间API的一大亮点。旧的java.util.TimeZone提供的时区不全不说,操作还非常繁琐,新的时区类java.time.ZoneId是原有的java.util.TimeZone类的替代品。ZoneId对象可以通过ZoneId.of()方法创建,也可以通过ZoneId.systemDefault()获取系统默认时区。
ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
ZoneId systemZoneId = ZoneId.systemDefault();
of()方法接收一个“区域/城市”的字符串作为参数,你可以通过getAvailableZoneIds()方法获取所有合法的“区域/城市”字符串:
Set zoneIds = ZoneId.getAvailableZoneIds();
对于老的时区类TimeZone,Java 8也提供了转化方法:
ZoneId oldToNewZoneId = TimeZone.getDefault().toZoneId();
有了ZoneId,我们就可以将一个LocalDate、LocalTime或LocalDateTime对象转化为ZonedDateTime对象:
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, shanghaiZoneId);
将zonedDateTime打印到控制台为:
2020-02-22T16:50:54.658+08:00[Asia/Shanghai]
ZonedDateTime对象由两部分构成,LocalDateTime和ZoneId,其中2020-02-22T16:50:54.658部分为LocalDateTime,+08:00[Asia/Shanghai]部分为ZoneId。另一种表示时区的方式是使用ZoneOffset,它是以当前时间和世界标准时间(UTC)/格林威治时间(GMT)的偏差来计算,例如:
ZoneOffset zoneOffset = ZoneOffset.of("+09:00");
LocalDateTime localDateTime = LocalDateTime.now();
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, zoneOffset);
Instant是时间线上的一个点,表示一个时间戳。Instant可以精确到纳秒,这超过了long的最大表示范围,所以在Instant的实现中是分成了两部分来表示,一部分是seconds
,表示从1970-01-01 00:00:00开始到现在的秒数,另一个部分是nanos
,表示纳秒部分。以下是创建Instant的两种方法:
Instant now = Instant.now();
//获取当前时刻的时间戳,结果为:2020-04-02T07:30:23.811Z;
Instant instant = Instant.ofEpochSecond(600, 1000000);
//ofEpochSecond()方法的第一个参数为秒,第二个参数为纳秒,上面的代码表示从1970-01-01 00:00:00开始后一分钟的10万纳秒的时刻,
//其结果为:1970-01-01T00:10:00.001Z。