【Java 8 新特性】Java LocalDateTime 和 Date 互相转换


本页将提供从 Java java.time.LocalDateTimejava.util.Date以及从 java.util.Datejava.time.LocalDateTime的转换实例。

Java 8中引入的LocalDateTime是没有时区的日期时间。

Date表示一个特定的时间瞬间,精度为毫秒。

1. LocalDateTime 转 Date

LocalDateTime不包括时区,而Date代表一个具体的时间瞬间,精度为毫秒。

为了从LocalDateTime转换到Date,我们需要提供时区。

LocalDateTime + Time-Zone = Date

我们可以用以下方法将LocalDateTime转换为Date

1.用 LocalDateTime.atZone(): 它把这个日期时间和一个给定的时区结合起来,创建一个ZonedDateTime。然后这个ZonedDateTime可以被转换为Instant。Date.from()方法接受Instant并返回相等的Date实例。

LocalDateTime localDateTime = LocalDateTime.parse("2019-11-15T13:15:30");
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date date = Date.from(instant);
System.out.println(date); 

2.用 LocalDateTime.toInstant(): 它将这个本地的日期时间和指定的偏移量结合起来,形成Instant

instant = localDateTime.toInstant(ZoneOffset.UTC);
date = Date.from(instant);
System.out.println(date); 

3.用 Timestamp.valueOf(): 它将一个JDBC时间戳转义格式的字符串对象转换为一个Timestamp值。给定的字符串日期应该是yyyy-MM-dd HH:mm:ss格式。

instant = Timestamp.valueOf(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).toInstant();
date = Date.from(instant);
System.out.println(date); 

为了创建Date实例,我们也使用Date构造函数来传递时间,单位为毫秒。

Timestamp timestamp = Timestamp.valueOf(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
date = new Date(timestamp.getTime());
System.out.println(date); 

示例

LocalDateTimeToDate.java

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class LocalDateTimeToDate {
  public static void main(String[] args) {
	LocalDateTime localDateTime = LocalDateTime.parse("2019-11-15T13:15:30");

	Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
	Date date = Date.from(instant);
	System.out.println(date);

	instant = localDateTime.toInstant(ZoneOffset.UTC);
	date = Date.from(instant);
	System.out.println(date);

	instant = Timestamp.valueOf(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).toInstant();
	date = Date.from(instant);
	System.out.println(date);

	Timestamp timestamp = Timestamp.valueOf(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
	date = new Date(timestamp.getTime());
	System.out.println(date);
  }
} 

输出

Fri Nov 15 13:15:30 IST 2019
Fri Nov 15 18:45:30 IST 2019
Fri Nov 15 13:15:30 IST 2019
Fri Nov 15 13:15:30 IST 2019 

2. Date 转 LocalDateTime

我们可以通过以下方式将Date转换为LocalDateTime

1.首先使用Instant.ofEpochMilli()方法将Date转换为Instant。然后使用LocalDateTime.ofInstant()方法将Instant转换为具有给定区域IDLocalDateTime

Date date = new Date();
LocalDateTime localDateTime = 
  LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
System.out.println(localDateTime); 

2.首先将Date转换为Instant,然后使用Instant.atZone()附加区域ID,这将返回ZonedDateTime。然后使用ZonedDateTime.toLocalDateTime()来获得LocalDateTime实例。

localDateTime = 
    Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(localDateTime); 

示例

DateToLocalDateTime.java

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateToLocalDateTime {
  public static void main(String[] args) {
	  Date date = new Date();
	  LocalDateTime localDateTime = 
		  LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
	  System.out.println(localDateTime);
	  
	  localDateTime = 
		  Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
	  System.out.println(localDateTime);
  }
} 

输出

2019-08-28T20:31:13.473
2019-08-28T20:31:13.473 

参考文献

【1】Class LocalDateTime
【2】Class Date
【3】Convert between Java LocalDateTime and Date

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值