一、前言
大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换!
从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用!!!
每次写完就忘记了,小编专门来整理一篇来详细说一下他们转换的方法,方便后面使用!!
二、日期格式转换
LocalDateTime 和 Date 互相转换
Date 转 LocalDateTime
Java8 发行的时候,也考虑到了新旧 API 之间的转换,所以在java.util.Date
中增加了toInstance()
方法,可以得到一个Instance
实例。Instance没有时区概念,所以我们需要通过atZone()
指定时区,得到ZonedDateTime实例,然后转换为java.time.LocalDate
。
如下:
Date dateNow = new Date();
LocalDateTime localDateTime = dateNow.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
同样的,我们也可以借助Instance的ofEpochMilli()方法创建实例。如下:
Date dateNow = new Date();
LocalDateTime localDateTime = Instant.ofEpochMilli(dateNow.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
}
Date转LocalDate、LocalTime的原理同上。
java.util.Date
是包含年月日时分秒的,转为java.time.LocalDateTime
是精度保留,转为java.time.LocalDate
是把时分秒去掉,转换方式完全一样,只不过要用到的是toLocalDate()
方法和toLocalTime()
方法。
LocalDateTime 转 Date
同理,可得LocalDate、LocalTime转Date的方法。
LocalDateTime localDateTime = LocalDateTime.now()
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
LocalDateTime 和 String 互相转换
LocalDateTime 转 String
LocalDate类有一个format()方法,可以将日期转成字符串。format()方法需要一个DateTimeFormatter对象作为参数。
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = LocalDateTime.now().format(dateTimeFormatter);
String 转 LocalDateTime
我们可以使用parse()方法从字符串中解析日期对象
String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr);
LocalDateTime 和 Instant 互相转换
LocalDateTime
表示没有时区的日期时间,如2019-10-25T12:15:30,而Instant
是时间线上的一个瞬时点。
LocalDateTime 转 Instant
LocalDateTime localDateTime = LocalDateTime.now();
Instant instant;
//第一种方式:Using LocalDateTime.toInstant()
instant = localDateTime.toInstant(ZoneOffset.UTC);
//第二种方式:Using LocalDateTime.atZone() and Instant.atZone()
instant =localDateTime.atZone(ZoneId.systemDefault()).toInstant();
//第三种方式:Using LocalDateTime.toEpochSecond() and Instant.ofEpochSecond()
long timeInSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC);
instant = Instant.ofEpochSecond(timeInSeconds);
Instant 转 LocalDateTime
//Using LocalDateTime.ofInstant
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
long timeInSeconds = 1567109422L;
localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());
localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds, 0), ZoneId.systemDefault());
long timeInMillis = 1567109422123L;
localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());
//Using Timestamp
localDateTime = Timestamp.from(Instant.now()).toLocalDateTime();
Date 和 String 互相转换
Date 转 String
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
String dateStr = df.format(now);
String 转 Date
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
String dateStr = df.format(now);
Date date = df.parse(dateStr);