将本地时间 (Java 8) 转换为日期
Convert LocalTime (Java 8) to Date
我正在尝试将 java.time.LocalTime
对象转换为 java.util.Date
,但找不到任何合适的方法。正确的做法是什么?
为什么 java 似乎没有附带内置的直接转换方法?
可能重复:
How to convert joda time - 对我不起作用,可能我缺少一些 "joda" 库?
- 这解决了相反的转换问题。
LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
LocalTime 实际上不能转换为Date,因为它只包含DateTime 的time 部分。喜欢11:00。但不知道哪一天。您必须手动提供它:
LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
这是一个博客 post,explains all the conversions 介于新旧 API 之间。
没有简单的内置转换方法,因为这些 API 以完全不同的方式处理日期和时间。
我把数据(小时、分钟、秒)一个一个添加(从当地时间到日期):
reta.setHours(vol.getRetard().getHour());
reta.setMinutes(vol.getRetard().getMinute());
reta.setSeconds(vol.getRetard().getSecond());
注:
reta: 可验证日期;
vol.getRetard(): 本地时间变量
这是另一种方法:
我们可以将 LocalDate 添加到 LocalTime 以使其成为 LocalDateTime,然后使用 java.sql.Timestamp 的 valueOf 方法将其转换为 Date,如下所示:
LocalTime localTime = LocalTime.now();
Date date = java.sql.Timestamp.valueOf(localTime.atDate(LocalDate.now()));
正如其他人所说,这是一个有问题的问题,因为 LocalTime
和 Date
确实代表了完全不同且几乎不相关的概念。 LocalTime
是一天中没有时区的时间,例如 19:45(或 7:45 下午)。 ADate
是时间线上的一个点;如果它恰好在某个时区的某个日期与 19:45 重合,则不会在其他时区。
我认为滥用(实际上)Date
一天中一个小时的传统方法是将其设置为 JVM 默认时区中 1970 年 1 月 1 日的那个时间。这种做法承担了已经提到的所有责任。特别是 JVM 默认时区设置可以随时从程序的另一部分或同一 JVM 中的任何其他程序 运行 更改。这意味着一个完全不相关的程序可能会突然导致您的 Date
指示与您初始化的时间不同的一天中的时间。
我们无能为力,所以这里是:
LocalTime time = LocalTime.of(11, 0);
Instant timeOnEpochDayInDefaultTimeZone = LocalDate.EPOCH
.atTime(time)
.atZone(ZoneId.systemDefault())
.toInstant();
Date oldfashionedDateObject = Date.from(timeOnEpochDayInDefaultTimeZone);
System.out.println(oldfashionedDateObject);
在我所在的时区,这段代码的输出是:
Thu Jan 01 11:00:00 CET 1970
我正在尝试将 java.time.LocalTime
对象转换为 java.util.Date
,但找不到任何合适的方法。正确的做法是什么?
为什么 java 似乎没有附带内置的直接转换方法?
可能重复:
How to convert joda time - 对我不起作用,可能我缺少一些 "joda" 库?
LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
LocalTime 实际上不能转换为Date,因为它只包含DateTime 的time 部分。喜欢11:00。但不知道哪一天。您必须手动提供它:
LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
这是一个博客 post,explains all the conversions 介于新旧 API 之间。
没有简单的内置转换方法,因为这些 API 以完全不同的方式处理日期和时间。
我把数据(小时、分钟、秒)一个一个添加(从当地时间到日期):
reta.setHours(vol.getRetard().getHour());
reta.setMinutes(vol.getRetard().getMinute());
reta.setSeconds(vol.getRetard().getSecond());
注: reta: 可验证日期; vol.getRetard(): 本地时间变量
这是另一种方法:
我们可以将 LocalDate 添加到 LocalTime 以使其成为 LocalDateTime,然后使用 java.sql.Timestamp 的 valueOf 方法将其转换为 Date,如下所示:
LocalTime localTime = LocalTime.now();
Date date = java.sql.Timestamp.valueOf(localTime.atDate(LocalDate.now()));
正如其他人所说,这是一个有问题的问题,因为 LocalTime
和 Date
确实代表了完全不同且几乎不相关的概念。 LocalTime
是一天中没有时区的时间,例如 19:45(或 7:45 下午)。 ADate
是时间线上的一个点;如果它恰好在某个时区的某个日期与 19:45 重合,则不会在其他时区。
我认为滥用(实际上)Date
一天中一个小时的传统方法是将其设置为 JVM 默认时区中 1970 年 1 月 1 日的那个时间。这种做法承担了已经提到的所有责任。特别是 JVM 默认时区设置可以随时从程序的另一部分或同一 JVM 中的任何其他程序 运行 更改。这意味着一个完全不相关的程序可能会突然导致您的 Date
指示与您初始化的时间不同的一天中的时间。
我们无能为力,所以这里是:
LocalTime time = LocalTime.of(11, 0);
Instant timeOnEpochDayInDefaultTimeZone = LocalDate.EPOCH
.atTime(time)
.atZone(ZoneId.systemDefault())
.toInstant();
Date oldfashionedDateObject = Date.from(timeOnEpochDayInDefaultTimeZone);
System.out.println(oldfashionedDateObject);
在我所在的时区,这段代码的输出是:
Thu Jan 01 11:00:00 CET 1970