如何将 java.time.format.TemporalAccessor 转换为 java.util.Date

Dán*_*Kis 8 java date temporal java.util.date datetime-conversion

如何将 TemporalAccessor 转换为 java.util.Date?

TemporalAccessor accessor = functionReturnsTemporalAccessor()
Date date = Date.from(accessor)
Run Code Online (Sandbox Code Playgroud)

Date.from()不接受TemporalAccessor,有什么方法可以转换为java.util.Date吗?

Ole*_*.V. 6

\n

DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(...)返回\nTemporalAccessor

\n
\n

真的。不要\xe2\x80\x99使用该方法。请改用 one-arg OffsetDateTime.parse(CharSequence)。例子:

\n
    String isoOffsetDateTimeString = "2020-11-13T21:07:38.146120+01:00";\n    OffsetDateTime dateTime = OffsetDateTime.parse(isoOffsetDateTimeString);\n    Instant asInstant = dateTime.toInstant();\n    Date oldfashionedDate = Date.from(asInstant);\n    System.out.println(oldfashionedDate);\n
Run Code Online (Sandbox Code Playgroud)\n

我的时区的输出:

\n
\n

欧洲中部时间 2020 年 11 月 13 日星期五 21:07:38

\n
\n

Date如果可以避免的话,也不要使用\xe2\x80\x99 。该类设计不佳且早已过时。我假设您需要一个旧版 API,而您现在无法升级到 java.time。

\n

one-argOffsetDateTime.parse()完全接受 指定的格式DateTimeFormatter.ISO_OFFSET_DATE_TIME,因此是您尝试的一个很好的替代品。

\n

虽然可以TemporalAccessor将返回的 from转换DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse()为 a Date,但不切实际,通常不能将 a 转换TemporalAccessor为 a Date。每个TemporalAccessor都有一些它支持的字段和一些它不支持的字段\xe2\x80\x99t。由于 a Date(尽管名称如此)是一个时间点,因此TemporalAccessor需要定义一个时间点,但并非所有TemporalAccessor对象都这样做。

\n

如果您已经习惯了旧的、设计不佳且现已过时的 Java 日期和时间类(如SimpleDateFormat和 )Date,那么您已经习惯了在格式化程序上调用parse和方法。对于 java.time,传统的方法是相反的:我们现在通常调用日期时间类的format静态方法,例如,可选地给出一个as 参数(在这种情况下,\xe2\x80\x99t 是不必要的)。类似地,我们调用日期时间对象上的方法,再次传递 a作为参数。parseOffsetDateTimeDateTimeFormatterformatDateTimeFormatter

\n


kid*_*ney 2

我想这取决于TemporalAccessor你的方法返回的类型。但是ISO_OFFSET_DATE_TIME您在评论中提到的输出应该可以处理:

TemporalAccessor accessor = functionReturnsTemporalAccessor();
Date date = new Date(Instant.from(accessor).toEpochMilli());
Run Code Online (Sandbox Code Playgroud)