[TOC]
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
网友评论