java 8 date time

简述

时间 / 日期处理是我们开发中经常要做的事情, 在这里分享一下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时区IDAsia/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


个人微信公众号【码农峰】,每天推送最新行业资讯,每周推送原创技术文章,欢迎关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值