ChatGPT解决这个技术问题 Extra ChatGPT

将 java.time.LocalDate 转换为 java.util.Date 类型

我想将 java.time.LocalDate 转换为 java.util.Date 类型。因为我想将日期设置为 JDateChooser。或者是否有任何支持 java.time 日期的日期选择器?

LGoodDatePicker 原生使用 java.time 包(又名 Java 8 时间或 JSR-310。具体来说,LGoodDatePicker 使用“java.time.LocalDate”来存储日期值。屏幕截图和演示位于Project Homepage

J
JB Nizet
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

假设您的日期选择器使用系统默认时区将日期转换为字符串。


我不知道为什么,但是使用这种转换,我得到了 1893 年 4 月之前日期的错误结果
据我了解,是否可以避免 atStartOfDay(),因为它会更改日期的值。
@JBNizet 你的回答对我来说没有多大意义,这就是我决定澄清的原因。你为什么不澄清它而不是发表无用的评论?
因为我不明白它如何以及为什么需要任何澄清。 232 人赞成这个答案,因此很清楚。你说 atStartOfDay 改变了日期的值。那没有意义。 atStartOfDay 执行 javadoc 所说的操作:它将 LocalDate 转换为 LocalDateTime,在同一天,在一天的开始。
@cornz 你确定你的结果不正确吗?如果您在德国,那么这可能与 1893 年 4 月德国时间的 6 分 32 秒故障有关。有关详细信息,请参阅 timeanddate.com/time/zone/germany/berlin?syear=1850
N
Nicholas DiPiazza

这是我用来将较新的 java.time 类转换为 java.util.Date 对象的实用程序类,反之亦然:

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

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

根据@Oliv 评论编辑。


使用 ZoneId.systemDefault() 没有问题,因为时区在一年中会发生变化。因此,如果在 1 月 1 日我在时区 -05:00(中央),但是在 7 月 1 日我在时区 -06:00(中央日光)不会因为夏令时而导致不准确的结果时间?
G
George

免责声明:仅用于说明现有的 java api。不应在生产代码中使用。

您可以将 java.sql.Date.valueOf() 方法用作:

Date date = java.sql.Date.valueOf(localDate);

无需在此处添加时间和时区信息,因为它们是隐含的。
请参阅LocalDate to java.util.Date and vice versa simplest conversion?


java.sql.Date 用于数据库层、JDBC、JPA。 Web 层(或任何客户端应用程序)绝对不应依赖于 java.sql.*
@Tiny java.sql.Date 位于 rt.jar 中。没有任何外部依赖项。您只需使用语言功能。
java.sql.Date 只是时间设置为 00:00:00java.util.Date,但从设计的角度来看,java.sql.* 并不适用于客户端与之交互的前端层,例如 Servlets/JSP。 java.util.Date in Java side and java.sql.Timestamp or whatever applicable from java.sql.* in JDBC side
根据 java.time.* 作者:stackoverflow.com/questions/33066904/…,这是一个“可怕的 hack”。在 Java 9 java.sql.* 中,类将是一个单独的依赖项。
如果它是可怕的 hack,为什么 java 不在 java.util 中包含这个简单的东西.. 日复一日,java 变得比 b4 更疯狂
K
Kevin Sadler

java.time 具有 Temporal 接口,您可以使用它从大多数时间类中创建 Instant 对象。 Instant 表示 Epoch 时间轴上的毫秒数 - 所有其他日期和时间的基本参考。

我们需要将 Date 转换为 ZonedDateTime,带有 Time 和 Zone,以进行转换:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

c
ceklock

这对我有用:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


这是非常低效的
转换为 Instant 可能很冗长,但构建和解析字符串就像从纽约经东京到墨西哥城......
@ehecatl 当心...在未来纽约 -> 东京 -> 墨西哥城可能会在几小时内完成;)
当我在转换时不再拥有时区信息时,这更适合我的用例。例如,与 Freemaker 合作打印日期。
J
Jayendran

为了从 java.time.LocalDate 创建 java.util.Date,您必须

向 LocalDate 添加时间

解释时区内的日期和时间

获取自纪元以来的秒数/毫秒数

创建一个 java.util.Date

代码可能如下所示:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

区域 ID 中的错字 (ZoneIf)
localDate.atStartOfDay() 创建 ZonedDateTime,但 ZonedDateTime 没有 toEpochSecond() 方法。
@KevinSadler:方法 toEpochSecond 继承自 java.time.chrono.ChronoZonedDateTime。请参阅docs.oracle.com/javase/8/docs/api/java/time/chrono/…
@nosid 感谢您的指正。当我在 Eclipse 中使用代码完成时,它(和 toInstance)不作为选项出现。但是,如果我完整地输入它,它似乎被接受了。由于这个事实,我错误地断定它不是一种方法,并且我没有在 ZonedDateTime 的 Javadoc 上看到它,因为它被列为继承方法,正如你所说。抱歉,请接受 upclick :)
g
gyoder

Kotlin 解决方案:

1)将此扩展功能粘贴到某处。

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2)使用它,永远不要再用谷歌搜索它。

val myDate = myLocalDate.toDate()

“切换到 Kotlin”有多简单?这是一个Java问题。
将 Java LocalDate 转换为 Date 对于任何 JVM 开发人员来说都是一个常见的、烦人的问题。这是 Kotlin 开发人员的解决方案。
谢谢!我正在寻找 Kotlin 解决方案。
W
William Nguyen
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

请解释您的解决方案。
r
redd77
    LocalDate date = LocalDate.now();
    DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
    try {
        Date utilDate= formatter.parse(date.toString());
    } catch (ParseException e) {
        // handle exception
    }

A
Aza
localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));

通过添加有关代码的作用以及它如何帮助 OP 的附加信息,可以改进您的答案。
问题是如何从 LocalDate 转换为 Date,而不是 String。
N
Nicolay

尝试这个:

public Date convertFrom(LocalDate date) {
    return Date.valueOf(date);
}

valueOf 方法是 java.sql.Date 的成员,问题指定 java.util.Date。
A
Artur Luiz Oliveira

简单的

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

M
Mahendra Sri Dayarathna
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

您的答案与 4 年后接受的答案有何不同?复制粘贴来提高声望?