简述
时间 / 日期处理是我们开发中经常要做的事情, 在这里分享一下java 8的时间处理。
之前常用的Date、Calendar,个人感觉用的比较别扭,而且存在时区转换、线程不安全等问题。
java 8引入了新的日期时间api以解决老api存在的问题,添加了java.time包,以及一些类。
以下是几个我们在使用中可能用到的类(都位于java.time包下):
Class | 描述 | 形式 |
---|---|---|
LocalDate | 日期 | 2019-11-06 |
LocalTime | 时间 | 16:47:30 |
LocalDateTime | 日期+时间 | 2019-11-06T16:47:30 |
ZoneId | 时区ID | Asia/Shanghai |
ZoneOffset | 基于UTC时区的偏移量 | +08:00 |
ZonedDateTime | 带时区的日期+时间 | 2019-11-06T16:47:30+08:00 Asia/Shanghai |
Instant | 瞬间,表示某个时间点 | |
Period | 日期间隔,年月日的间隔 | 1年1月1日 |
Duration | 时间间隔,时分秒的间隔 | 2时2分2秒 |
DateTimeFormatter | 格式化时间 | 相当于以前的SimpleDateFormat |
具体的描述可以查看源码或者查看官方文档,下面列举一些简单的api应用和开发中可能遇到的场景。
code
api简单使用
// 获取当前时间 2019-11-06T17:18:24.786
LocalDateTime now = LocalDateTime.now();
// 创建时间 2019-11-06T17:17
LocalDateTime of = LocalDateTime.of(2019, 11, 6, 17, 17);
// 指定时区获取当前时间, ZoneId.systemDefault()是系统默认时区
LocalDateTime.now(ZoneId.systemDefault());
// ZoneId.of方法指定时区返回ZoneId
LocalDateTime.now(ZoneId.of("Asia/Shanghai"))
// 以下这两个方法返回的都是UTC时间, 使用时需要转换时区
// 给定秒值返回Instant 2019-11-06T09:33:14Z
Instant instant = Instant.ofEpochSecond(1573032794);
// 给定毫秒值返回Instant 2019-11-06T09:33:14Z
Instant instant1 = Instant.ofEpochMilli(1573032794000l);
// 将Instant转换为LocalDateTime, 转换的时候要指定时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// 将LocalDateTime转换为Instant, 转换是要指定时区偏移量
Instant instant2 = localDateTime.toInstant(ZoneOffset.of("+8"));
// 下面表示分别创建1天的时间段 和 一个小时的时间段
Period period = Period.ofDays(1);
Duration duration = Duration.ofHours(1);
// 格式化时间 2019-11-06 17:52:31
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str =LocalDateTime.now().format(format);
System.out.println(str);
将timestamp秒值转换为yyyyMMddHH
public static String timestamp2str(long timestamp) {
Instant instant = Instant.ofEpochSecond(timestamp);
LocalDateTime time = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHH");
return time.format(format);
}
距离下班的时间
public static void time2paolu() {
LocalTime now = LocalTime.now();
LocalTime paolu = LocalTime.of(18, 30);
long until = now.until(paolu, MINUTES);
System.out.printf("还有%d分钟可以跑路", until);
}
距离过年的时间
public static void time2guonian() {
LocalDate today = LocalDate.now();
LocalDate guonian = LocalDate.of(2020, 1, 24);
Period period = Period.between(today, guonian);
System.out.printf(
"还有%d年%d月%d天可以回家",
period.getYears(),
period.getMonths(),
period.getDays() - 3);
}
总结
java.time下面的类注释中都写了This class is immutable and thread-safe. 表明了每个类是不可变且线程安全的,我们可以放心使用。
参考
https://www.baeldung.com/java-8-date-time-intro
https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
个人微信公众号【码农峰】,每天推送最新行业资讯,每周推送原创技术文章,欢迎关注。