将java.time.temporal.Temporal转换为java.util.Date

8
我该如何将一个java.time.temporal.Temporal实例转换为java.util.Date实例?
java.time.temporal.Temporal someTemporal = Instant.now();
java.util.Date some Temporal = x(someTemporal);

我查看了Oracle的旧版时间文档,但没有找到适合的解决方案。


2
类型“Temporal”非常通用和抽象,以至于几乎不可能找到解决方案,即转换为“java.util.Date”。例如考虑类型“LocalDate”,如果没有任何上下文信息(如时区或时钟时间),如何进行转换? - Meno Hochschild
1
然而,如果你只想转换 java.time.Instant,那么它就非常简单。查看 java.util.Date 的 API(参见方法 from(Instant))。 - Meno Hochschild
3个回答

11

我强烈建议不要涉及任何关于(太)一般化接口java.time.temporal.Temporal的参考,而是只需这样做:

java.util.Date some = java.util.Date.from(Instant.now());

使用接口Temporal几乎就像使用java.lang.Object一样。您应该尽可能具体地描述日期和时间的上下文。即使是JSR-310-API也正式发出警告:

此接口是一个框架级别的接口,不应在应用程序代码中广泛使用。相反,应用程序应创建并传递实例化的具体类型,例如LocalDate。之所以这样做,其中一部分原因是该接口的实现可能在不同于ISO的日历系统中。有关问题的更充分讨论,请参见ChronoLocalDate。


-1

底部内容如下:

尽管 java.time.format.DateTimeFormatter 提供了一个强大的机制来格式化日期和时间值,但您也可以直接使用基于 java.time 的类与 java.util.Formatter 和 String.format 一起使用相同基于模式的格式化,就像您在使用 java.util 日期和时间类时所使用的一样。

看起来您可能希望使用 DateTimeFormatter 类,具体请参考 此处的文档,或者按照以下示例进行操作:

LocalDate date = LocalDate.now();
String text = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(text, formatter);

@MenoHochschild没错,我的回答为他提供了一个LocalDate,它是一种日期格式,并且可以转换为java.util.Date对象。 - Trevor Yokum
1
@TrevorYokum 这个问题是询问如何转换成 java.util.Date 类型。你的回答跟这没有任何关系... - assylias

-3

我认为你的问题有一点不对。相反,我认为你想要知道如何使用通用接口将任何Java时间具体类(例如Instant、LocalDate)转换为日期。我认为TemporalAccessor就是这个接口。

@Test
public void convertTemportalAccessorTypeToDate() throws Exception {
    Instant instant = Instant.now();
    Date expected = Date.from( instant );
    TemporalAccessor now = instant;

    long nanos = now.getLong( ChronoField.NANO_OF_SECOND );
    long epochSeconds = now.getLong( ChronoField.INSTANT_SECONDS );
    Date date1 = Date.from( Instant.ofEpochSecond( epochSeconds, nanos ) );
    assertThat( date1, is( expected ));
}

话虽如此,具体类型实际上必须支持ChronoField,如果不支持似乎会抛出UnsupportedTemporalTypeException异常,因此可能需要用try catch包装一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接