Java 8有一个全新的日期和时间API。这个API中最有用的类之一是LocalDateTime,用于保存一个与时区无关的date-with-time值。

可能有数百万行代码使用遗留类java.util.Date来实现这个目的。因此,当新旧代码进行接口时,就需要在两者之间进行转换。由于似乎没有直接的方法来实现这一点,怎么能做到呢?


当前回答

下面是我想到的(就像所有的日期时间难题一样,它可能会被推翻,基于一些奇怪的时区-闰日-日光调整: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

其他回答

更方便的方法,如果你确定你需要一个默认时区:

Date d = java.sql.Timestamp.valueOf( myLocalDateTime );

当从新的API LocalDateTime转换为java.util.date时,下面的代码似乎可以工作:

Date.from(ZonedDateTime.of({time as LocalDateTime}, ZoneId.systemDefault()).toInstant());

反向转换可以(希望)以类似的方式实现……

希望能有所帮助……

LocalDateTime -> Date的最快方法是:

Date.from(ldt.toInstant(ZoneOffset.UTC))

所有东西都在这里:http://blog.progs.be/542/date-to-java-time

“往返”的答案并不确切:当你这样做的时候

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

如果您的系统时区不是UTC/GMT,则更改时间!

我认为下面的方法将解决转换不考虑时区。 如有缺陷请评论。

    LocalDateTime datetime //input
    public static final DateTimeFormatter yyyyMMddHHmmss_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formatDateTime = datetime.format(yyyyMMddHHmmss_DATE_FORMAT);
    Date outputDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(formatDateTime); //output