Java8中的LocalDateTime、Instant、DateTimeFormatter

1. 概要

Java8出现的 Instant 类似于 Date ,LocalDateTime 类似于 Calendar,DateTimeFormatter 类似于 SimpleDateFormat,由于 SimpleDateFormat 是线程不安全的(一般使用 SimpleDateFormat 的时会把它定义成静态变量,从而避免频繁地创建它的对象实例,但 SimpleDateFormat 内部使用 Calendar 去完成日期的转换,多线程情况下可能会出现线程不安全情况),推荐使用 Instant代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。具体用法如下例子,更多参考jdk8 api方法。

2. LocalDateTime

// 输出当前时间:2019-04-24T19:41:21.858
LocalDateTime now = LocalDateTime.now();
System.out.println(now);

// 格式化时间,输出:2019年04月24日 19:49:25
LocalDateTime time = LocalDateTime.now();
String timeStr = time.format(DateTimeFormatter.ofPattern("yyyy年年MM月dd日 HH:mm:ss"));
System.out.println(timeStr);

// 当前时间增加20分钟
LocalDateTime afterPlusTime = LocalDateTime.now().plus(20, ChronoUnit.MINUTES);
System.out.println(afterPlusTime);

// 创建开始和结束时间,并计算中间差值
LocalDateTime start = LocalDateTime.of(1992, 8, 13, 0, 0, 0);
LocalDateTime end = LocalDateTime.of(2019, 4, 25, 0, 0);
long diff = LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.YEARS);
System.out.println(diff+"年"); // 26
        
boolean b = start.isAfter(end);
System.out.println(b); // false

//获取秒数 (东8区,也就是北京时间)
Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//获取毫秒数(东8区,也就是北京时间)
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();

3. Instant

Instant now = Instant.now(); // 2019-04-24T12:30:34.349Z
long currentSecond = now.getEpochSecond(); // 秒数:1556109034
long currentMilli = now.toEpochMilli(); // 毫秒数:1556109034349

Instant afterPlusSecondInstant = now.plusSeconds(1000); // 秒数增加1000
boolean b = now.isBefore(afterPlusSecondInstant); // 比较

4. DateTimeFormatter

// 输出:2019年04月24日 20:53:23
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
LocalDateTime time = LocalDateTime.now();
String formatResult = time.format(df);

// 输出:20190424
LocalDateTime time = LocalDateTime.now();
String formatResult = time.format(DateTimeFormatter.BASIC_ISO_DATE);
除了DateTimeFormatter.BASIC_ISO_DATE,还有以下格式,如:

ISO_DATE            --> 2019-04-24
ISO_LOCAL_DATE      --> 2019-04-24
ISO_LOCAL_TIME      --> 20:59:48.42
ISO_TIME            --> 21:00:38.256
ISO_LOCAL_DATE_TIME --> 2019-04-24T21:01:11.083
.......

5. LocalDateTime、Instant、DateTimeFormatter 与Date的转换

Instant instant  = Instant.now();
Date date = Date.from(instant); // Instant转换为Date
Instant instant2 = date.toInstant(); // Date转换为Instant

// Date 与 LocalDateTime 的转换是通过 Instant 中间的转换来进行的
Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()); // Date转换为LocalDateTime

LocalDateTime localDateTime = LocalDateTime.now();
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date date = Date.from(instant); // LocalDateTime转换为Date
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值