当前位置: 首页 > 面试题库 >

在java.time.LocalDateTime和java.util.Date之间进行转换

莫欣悦
2023-03-14
问题内容

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

java.util.Date为此目的,可能有数百万行代码使用遗留类。这样,在连接旧代码和新代码时,将需要在两者之间进行转换。由于似乎没有直接的方法可以完成此任务,该怎么办呢?


问题答案:

简短答案:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

说明:(基于这个问题有关LocalDate)

尽管有名称,它java.util.Date代表时间轴上的一个瞬间,而不是“日期”。存储在对象中的实际数据是long自1970-01-01T00:00Z(1970 GMT / UTC开始的午夜)以来的毫秒数。

java.util.DateJSR-310中的等效类是Instant,因此有方便的方法来回转换:

Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);

一个java.util.Date实例没有时区的概念。如果调用toString(),这可能看起来很奇怪java.util.Date,因为toString相对于时区。但是,该方法实际上是即时使用Java的默认时区来提供字符串。时区不是的实际状态的一部分java.util.Date

一个Instant还没有关于时区的任何信息。因此,要从转换Instant为本地日期时间,必须指定一个时区。这可能是默认区域- ZoneId.systemDefault()或它可能是你的应用程序控制的时区,例如来自用户首选项的时区。LocalDateTime有一个方便的工厂方法,它同时包含即时和时区:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());

相反,LocalDateTime时区是通过调用atZone(ZoneId)方法指定的。所述ZonedDateTime然后可以直接转化为Instant:

LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());

请注意,从转换LocalDateTime到ZonedDateTime具有引进意外行为的可能性。这是因为由于夏时制,并非每个本地日期时间都存在。在秋季/秋季,本地时间线重叠,同一本地日期时间出现两次。在spring,有一个间隙,一个小时消失了。有关atZone(ZoneId)转换功能的更多定义,请参见的Javadoc 。

总结,由于夏令时,如果你java.util.Date将a 往返于a LocalDateTime并返回到a,java.util.Date你可能会得到不同的时刻。

附加信息:还有另一个差异会影响非常旧的日期。java.util.Date使用1582年10月15日更改的日历,其日期使用儒略历而不是公历。相比之下,java.time.*始终使用ISO日历系统(等同于公历)。在大多数使用情况下,ISO日历系统是你想要的,但是比较1582年之前的日期可能会看到奇怪的效果。



 类似资料:
  • 问题内容: 我正在寻找在两个方向上在java.util.Date和javax.xml.datatype.XMLGregorianCalendar之间进行转换的简单方法。 这是我现在正在使用的代码 : 有没有更简单的事情,例如我忽略的一些API调用? 在标准XML日期/时间和Java日期对象之间进行转换似乎是一项非常常规的任务,令我感到惊讶的是,我完全必须编写这段代码。 有什么建议? 注意: 我的J

  • 问题内容: 我有使用java.util.Date创建旧日期(0002年11月30日)的旧代码。我正在尝试更新可以执行的代码,但这需要在Date和LocalDate之间进行转换,等等。我无法完全摆脱使用Date或古老的日期选择的麻烦。 我发现用这个古老的日期在Date和Instant之间来回转换时似乎出现了错误,并希望有人可以解释发生了什么。 这是一个示例: 打印以下内容: 因此,如果我在11月2日

  • 我有使用java.util.date创建古老日期(30 nov0002)的遗留代码。我试图更新我能更新的代码,但这需要在Date和LocalDate之间转换,等等。我不能完全摆脱Date的使用或古老的日期选择。 我发现在这个古老的日期之间来回转换Date和Instant时出现了一个错误,希望有人能解释一下是怎么回事。 它打印以下内容: 所以如果我在11月30日创建一个瞬间,然后转换成一个日期,这个

  • 今天,在做一个关于Facebook JavaScript问题的模拟采访时,我忽略了如何处理单链接列表。到目前为止,我的代码只是一个函数,它接受两个链表并返回另一个链表。我的计划在下面。 问题给你两个任意长度的非空链表,代表两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回。 您可以假设这两个数字不包含任何前导零,除了数字0本身。 示例: 输入:(2- 计划

  • 问题内容: 我可以使用一些指导,说明何时值得使用Joda Time而不是基本的java.util.Date类。有什么好处?Joda Time是让您做Date类无法做的事情,还是使用起来更容易? 另外,我已经看到有关Joda Time是否属于标准API的冲突信息。是否标准? 问题答案: Java的标准日期和时间类(主要是和)具有有限的功能,并且存在许多设计问题。不赞成使用许多构造函数和方法的事实就是

  • 问题内容: 我使用通用函数合并了scala 的scala 当存在相同的键冲突时,可以处理这种情况。但是,我想使用Scala Code中的Java集合来实现。我研究了一下,发现了。我导入并编写了这个 但是,它说类型不匹配 是不是用来隐式转换为?我在这里想念什么? 问题答案: 他们说尝试使用JavaConverters,因为不推荐使用JavaConversions。 也许要说明为什么不推荐使用它: 注