将java.util.Date
对象转换为新的JDK 8/JSR-310 的最佳方法是什么java.time.LocalDate
?
Date input = new Date();
LocalDate date = ???
Run Code Online (Sandbox Code Playgroud) Java 8有一个全新的日期和时间API.此API中最有用的类之一是LocalDateTime
,用于保存与时区无关的日期时间值.
java.util.Date
为此目的,使用遗留类可能有数百万行代码.因此,当连接新旧代码时,需要在两者之间进行转换.由于似乎没有直接的方法来实现这一点,怎么办呢?
我知道有关于java.util.Date和Joda-Time的问题.但经过一番挖掘后,我找不到关于java.time API(Java 8中新增,JSR 310定义)和Joda-Time之间差异的线程.
我听说Java 8的java.time API比Joda-Time更清洁,可以做得更多.但我找不到比较两者的例子.
我正在创建一个基于网络的系统,该系统将在世界各国使用.必须存储的一种数据是日期和时间.
使用Java日期和时间类与第三方库(如Joda时间)相比有哪些优缺点?我想这些第三方库存在的原因很充分,但我自己从未真正比较过它们.
我正在使用新的日期时间API,但在运行时:
public class Test {
public static void main(String[] args){
String dateFormatted = LocalDate.now()
.format(DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateFormatted);
}
}
Run Code Online (Sandbox Code Playgroud)
它抛出:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDate.format(LocalDate.java:1685)
at Test.main(Test.java:23)
Run Code Online (Sandbox Code Playgroud)
查看LocalDate类的源代码时,我看到:
private int get0(TemporalField field) {
switch ((ChronoField) field) {
case DAY_OF_WEEK: return getDayOfWeek().getValue();
case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + …
Run Code Online (Sandbox Code Playgroud) 我使用Java 8的新DateTime API.
如何将LocalDate转换为Instant?我得到一个例外
LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);
Run Code Online (Sandbox Code Playgroud)
而且我不明白为什么.
如何Long
从LocalDateTime
或的实例中提取纪元值LocalDate
?我尝试了以下内容,但它给了我其他结果:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Run Code Online (Sandbox Code Playgroud)
我想要的只是1391539861
本地日期时间的值"04.02.2014 19:51:01"
.我的时区是Europe/Oslo
UTC + 1,夏令时.
我正在使用Joda解析包含日期/时间的第三方日志文件.日期/时间是两种不同格式之一,具体取决于我正在解析的日志文件的年龄.
目前我的代码如下:
try {
return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}
Run Code Online (Sandbox Code Playgroud)
这有效但违反了Joshua Bloch关于Effective Java 2nd Edition的建议(第57项:仅在特殊条件下使用例外).它还使得很难确定是否由于日志文件中的日期/时间搞乱而发生IllegalArgumentException.
你能否提出一个不会滥用例外的更好的方法?
他们幸福地结婚了吗?
我正在使用最新版本的hibernate(4)和joda-time hibernate支持的 1.3版本,我也相信它是当前的最新版本.
使用注释时,一切似乎都正常工作(按预期创建日期列):
@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalDate")
private LocalDate myDate;
Run Code Online (Sandbox Code Playgroud)
将这些版本一起使用是否存在任何已知问题?
更新 确定列已创建但无法填充任何数据:
处理程序处理失败; 嵌套异常是java.lang.AbstractMethodError:org.joda.time.contrib.hibernate.PersistentLocalDateTime.nullSafeSet
它们是不兼容的,我应该使用usertype.见下面的答案.
将JodaTime转换LocalDate
为java.util.Date
对象的最简单方法是什么?