一,时间 类介绍
现有API存在的问题
线程安全: Date和Calendar不是线程安全的,你需要编写额外的代码处理线程安全问题
API设计和易用性: 由于Date和Calendar的设计不当你无法完成日常的日期操作
ZonedDate和Time: 你必须编写额外的逻辑处理时区和那些旧的逻辑
好在JSR 310规范中为Java8添加了新的API, 在java.time包中,新的API纠正了过去的缺陷
新的日期API
jdk8中表示的类有多个,主要的有:
类 | 作用 | 备注 |
---|---|---|
Instant | 表示时刻 | 对应jdk7之前的Date,可通过Epoch Time 纪元时相互转换,用来表示时间线上的一个点。 |
LocalDateTime | 获取当前系统的日期时间(内部不记录时区) | 可以认为由LocalDate和LocalTime组成,表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 |
LocalDate | 获取当前系统的日期 | 表示没有时区的日期, LocalDate是不可变并且线程安全的 |
LocalTime | 获取当前系统的时间 | 表示没有时区的时间, LocalTime是不可变并且线程安全的 |
ZoneId | 时区,"+01:00"和"Europe/Paris" | 时区ID,用来确定Instant和LocalDateTime互相转换的规则,ZoneId除了处理与标准时间的时间差还处理地区时(夏令时,冬令时等) |
ZoneOffset | 时区,只处理 "+01:00" | ZoneOffset是ZoneId的子类,只处理与格林尼治的时间差 |
ZoneDateTime | 特定时区的日期和时间 | LocalDateTime内部不记录时区,ZoneDateTime记录 |
二、时间类示例
Instant
代码示例
Instant instant = Instant.now();
System.out.println(instant);
运行结果
LocalDateTime
代码示例
// 直接获取
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
//指定年月日获取
LocalDateTime localDateTime1 = LocalDateTime.of(2019,2,15,20,20);
System.out.println(localDateTime1);
// 同时LocalDateTime有很多方法:例如单独获取年\月\日\小时\分钟\周几
int year = localDateTime.getYear();
System.out.println(year);
int dayOfYear = localDateTime.getDayOfYear();
System.out.println(dayOfYear);
DayOfWeek dayofWeek = localDateTime.getDayOfWeek();
System.out.println(dayofWeek);
运行结果
LocalDate
代码示例
LocalDate localDate = LocalDate.now();
System.out.println("localDate: " + localDate);
运行结果
三、日期类型转换
代码示例
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String patternString = formatter.format(ZonedDateTime.now());
System.out.println(patternString);
运行结果:(在代码中定义时间的样式,就可以转换成自己想要的。)
四、时间差
代码示例
// Period表示日期之间得差(年月日),包含to* 方法将差值转成*
// Duration表示时间差(日时分秒),包含to* 方法将差值转成*
Period period = Period.between(LocalDate.of(2009, 9, 1), LocalDate.of(2019, 8, 1));
System.out.println(period.getYears());
Duration duration = Duration.between(LocalTime.of(10,10),LocalTime.now());
System.out.println(duration.getSeconds());
运行结果