将java.util.Date
对象转换为新的JDK 8 / JSR-310 的最佳方法是什么java.time.LocalDate
?
Date input = new Date();
LocalDate date = ???
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
说明
尽管有名称,它java.util.Date
代表时间轴上的一个瞬间,而不是“日期”。存储在对象中的实际数据是long
自1970-01-01T00:00Z(1970 GMT / UTC开始的午夜)以来的毫秒数。
java.util.DateJSR-310
中的等效类是Instant
,因此有一种方便的方法toInstant()
可以提供转换:
Date input = new Date();
Instant instant = input.toInstant();
一个java.util.Date
实例没有时区的概念。如果调用toString()
,这可能看起来很奇怪java.util.Date
,因为toString
相对于时区。但是,该方法实际上是即时使用Java的默认时区来提供字符串。时区不是的实际状态的一部分java.util.Date
。
一个Instant还没有关于时区的任何信息。因此,要将Instant日期转换为本地日期,必须指定时区。这可能是默认区域- ZoneId.systemDefault()
或它可能是你的应用程序控制的时区,例如来自用户首选项的时区。使用该atZone()方法来应用时区:
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
一个ZonedDateTime
包含由本地日期和时间,时区,与GMT / UTC的偏移量的状态。因此,LocalDate可以使用toLocalDate()
以下命令轻松提取日期
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();
Java 9答案
在Java SE 9中,添加了一个新方法,该方法稍微简化了此任务:
Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());
问题内容: 我将日期以这种格式存储在SQLite数据库中: 当我以这种格式检索日期时,除小时外,其他一切都很好。时间总是如此。这是我的输出: 这是代码: 我究竟做错了什么? 问题答案: 我认为您的日期格式没有意义。没有13:00 PM。删除格式末尾的“ aaa”,或将HH转换为hh。 不过,这对我来说很好: 它将打印“ 2010年4月29日星期四CEST”。
问题内容: 我想将对象转换为 Java。 格式为 问题答案: 转换日期为字符串使用方法:
问题内容: 在保留时间戳的同时将java.sql.Date对象转换为java.util.Date的最简单方法是什么? 我试过了: 没有运气。它仍然只将日期部分存储到变量中。 问题答案: java.sql.Date类设计为仅包含日期而没有时间,因此您看到的转换结果对该类型是正确的。您需要使用java.sql.Timestamp来获取带时间的完整日期。
问题内容: 我想转换成类型。因为我想将日期设置为。还是有任何支持日期的日期选择器? 问题答案: 假设你的日期选择器使用系统默认时区将日期转换为字符串。
问题内容: 我有一个对象,或一个对象。如何在java.time框架中将其转换为正确的类型? 我听说我们现在应该使用类型来做大部分业务逻辑。当使用尚未为java.time更新的旧代码时,我需要能够来回转换。什么类型映射到或? 问题答案: 避免使用旧的日期时间类 老式的日期时间类(包括,和)已被证明设计不良,混乱且麻烦。尽可能避免它们。但是,当你必须与这些旧类型进行互操作时,可以在新旧之间进行转换。
问题内容: 我正在尝试使用作为输入,然后使用它创建查询-所以我需要一个。 我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为对我来说还很新。 问题答案: 没关系....