java日期时间API详解
程序员文章站
2022-04-29 23:52:51
...
基于JDK8
下面是基于JDK8来进行编码和讲解的。
重新定义
java8对时间和日期相关的操作进行了重新分类和整理,使得使用起来更加方便和实用。
- 对时间和日期的相关操作进行了细分:时间、日期、时间&日期,时间戳、时间段、格式化
- 所有类都是不可变的、线程安全的
- 兼容旧的日期和时间
API
对于一般来说,常用的API就是下面所列出的六种,在实际使用的过程中,需要哪个就使用哪个来进行操作。
- LocalDateTime:日期时间
- LocalDate:仅表示日期
- LocalTime:仅表示时间
- Peroid:仅表示日期间隔
- Duration:时间间隔,以秒和纳秒为单位
- DateTimeFormatter:可以格式化LocalDate,LocalTime以及LocalDateTime
常见用法
下面分别展示几个常见的用法,基本涵盖了常见的使用场景。
- 获取当前时间
LocalDateTime localDateTime = LocalDateTime.now();
// 打印结果: 2019-12-05T16:58:11.936
- 获取指定时间
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 12, 2, 23, 59, 59);
// 打印结果: 2019-12-02T23:59:59
- 日期/时间加减操作
// localDateTime2的基础上加1天零1s
LocalDateTime localDateTime3 = localDateTime2.plusDays(1).plusSeconds(1);
// 打印结果:2019-12-04T00:00
- 获取指定的字段(年月日时分秒,纳秒,不支持毫秒)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("现在是: " + localDateTime.getYear() + " 年中的第 " + localDateTime.getDayOfYear() +" 天");
// 现在是: 2019 年中的第 339 天
- 获取UTC时间(格林尼治时间)
Instant instant = Instant.now();
// 打印结果:2019-12-05T09:09:21.360Z
- 获取北京时间(东8区)
// OffsetTime表示有时差的时间,除了UTC时间,都是OffsetTime
Instant instant = Instant.now();
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
// 打印结果: 2019-12-05T17:10:38.330+08:00
- 获取毫秒数(1970-01-01T00:00:00Z开始计算)
Instant instant = Instant.now();
long epochMilli = instant.toEpochMilli();
// 打印结果:1575537087543
- 定义时间戳
Instant instant1 = Instant.ofEpochSecond(59);
// 打印结果: 1970-01-01T00:00:59Z
instant2 = instant1.plusSeconds(99)
// 打印结果:1970-01-01T00:02:38Z
- 计算日期间隔(参数位置影响结果哦)
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(99);
Duration duration1 = Duration.between(instant1, instant2);
Duration duration2 = Duration.between(instant2, instant1);
// 打印结果 duration1:PT1M39S
// 打印结果 duration2:PT-1M-39S
long duration1Seconds = duration1.getSeconds();
long duration2Seconds = duration1.getSeconds();
// 打印结果 duration1Seconds: 90
// 打印结果 duration2Seconds: -90
- 操作时间间隔
Duration duration3 = duration1.plusDays(1);
// 打印结果:PT24H1M39S
注意 : 仅支持时间操作(Instant, LocalTime,LocalDateTime),不支持日期(LocalDate)
- 日期间隔
LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = localDate1.plusDays(1);
Period period = Period.between(localDate1, localDate2);
long days = period.getDays();
//输出结果P1D
//输出结果1
- 获取指定日期或时间
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(20);
// 打印结果 localDateTime1:2019-12-09T11:08:25.055
// 打印结果 localDateTime2:2019-12-20T11:08:25.055
- 获取下一个固定日期(下一个星期天)
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
// 打印结果 localDateTime3:2019-12-15T11:09:46.092
- 定义矫正器
获取下一个工作日
LocalDateTime localDateTime4 = localDateTime.with((tempDateTime) -> {
LocalDateTime localDateTime5 = (LocalDateTime) tempDateTime;
DayOfWeek dayOfWeek = localDateTime5.getDayOfWeek();
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return localDateTime5.plusDays(3);
} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return localDateTime5.plusDays(2);
} else {
return localDateTime5.plusDays(1);
}
});
// 打印结果 localDateTime4:2019-12-10T11:11:57.218
- 日期时间格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
String dateStr =dateTimeFormatter.format(localDateTime);
System.out.println(dateStr);
// 打印结果: 2019-12-09 11:13:40
LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
System.out.println(localDateTime2);
// 打印结果: 2019-12-09T11:13:40
LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
System.out.println(localDate);
// 打印结果: 2019-12-09
基于Instant进行转换
Java8对于时间戳、日期时间以及老版本的Date对象之间的转化也进行了兼容和适配,所有转化操作都可以基于Instant对象进行,下面使用LocalDateTime进行演示
- 时间戳转LocalDate,LocalDate,LocalDateTime
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印结果:2019-12-09T11:22:42.629
- LocalDate,LocalDate,LocalDateTime转时间戳
LocalDateTime localDateTime = LocalDateTime.now();
long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 打印结果:1575861905995
- 兼容旧版本Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Date date = Date.from(localDateTime3.atZone(ZoneOffset.ofHours(8)).toInstant());
LocalDateTime localDateTime4 = localDateTime3.atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印结果 date:Mon Dec 09 11:30:04 CST 2019
// 打印结果 lcoalDateTime4:2019-12-09T11:30:04.470
上一篇: 基于tcp协议通信的套接字
下一篇: ssm项目 配置文件