Java 8有一个全新的日期和时间API。这个API中最有用的类之一是LocalDateTime,用于保存一个与时区无关的date-with-time值。
可能有数百万行代码使用遗留类java.util.Date来实现这个目的。因此,当新旧代码进行接口时,就需要在两者之间进行转换。由于似乎没有直接的方法来实现这一点,怎么能做到呢?
Java 8有一个全新的日期和时间API。这个API中最有用的类之一是LocalDateTime,用于保存一个与时区无关的date-with-time值。
可能有数百万行代码使用遗留类java.util.Date来实现这个目的。因此,当新旧代码进行接口时,就需要在两者之间进行转换。由于似乎没有直接的方法来实现这一点,怎么能做到呢?
当前回答
当从新的API LocalDateTime转换为java.util.date时,下面的代码似乎可以工作:
Date.from(ZonedDateTime.of({time as LocalDateTime}, ZoneId.systemDefault()).toInstant());
反向转换可以(希望)以类似的方式实现……
希望能有所帮助……
其他回答
更方便的方法,如果你确定你需要一个默认时区:
Date d = java.sql.Timestamp.valueOf( myLocalDateTime );
下面是我想到的(就像所有的日期时间难题一样,它可能会被推翻,基于一些奇怪的时区-闰日-日光调整:D)
往返:Date <<->> LocalDateTime
给定:日期日期=[某个日期]
LocalDateTime <<即时<<日期
Instant instant = Instant.ofEpochMilli(date.getTime());
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
(2) Date << Instant << LocalDateTime
Instant instant = ldt.toInstant(ZoneOffset.UTC);
Date date = Date.from(instant);
例子:
考虑到:
Date date = new Date();
System.out.println(date + " long: " + date.getTime());
LocalDateTime << Instant<< Date:
从日期创建即时:
Instant instant = Instant.ofEpochMilli(date.getTime());
System.out.println("Instant from Date:\n" + instant);
从即时创建日期(不是必需的,只是为了说明):
date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());
从即时创建LocalDateTime
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
System.out.println("LocalDateTime from Instant:\n" + ldt);
(2) Date << Instant << LocalDateTime
从LocalDateTime创建即时:
instant = ldt.toInstant(ZoneOffset.UTC);
System.out.println("Instant from LocalDateTime:\n" + instant);
从即时创建日期:
date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());
输出结果为:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574
Instant from Date:
2013-11-01T14:13:04.574Z
Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574
LocalDateTime from Instant:
2013-11-01T14:13:04.574
Instant from LocalDateTime:
2013-11-01T14:13:04.574Z
Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574
如果你在android上使用threetenbp,你可以使用DateTimeUtils代替。
例:
Date date = DateTimeUtils.toDate(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
你不能使用Date.from,因为它只支持api 26+
我不确定这是否是最简单或最好的方法,或者是否存在任何陷阱,但它确实有效:
static public LocalDateTime toLdt(Date date) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
ZonedDateTime zdt = cal.toZonedDateTime();
return zdt.toLocalDateTime();
}
static public Date fromLdt(LocalDateTime ldt) {
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
GregorianCalendar cal = GregorianCalendar.from(zdt);
return cal.getTime();
}
LocalDateTime -> Date的最快方法是:
Date.from(ldt.toInstant(ZoneOffset.UTC))