【发布时间】:2018-03-29 10:03:52
【问题描述】:
如果我在恰好是java.sql.Date 的变量上使用java.util.Date 的toInstant(),我会得到UnsupportedOperationException。
try {
java.util.Date input = new java.sql.Date(System.currentTimeMillis());
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (UnsupportedOperationException e) {
// grrr!
}
我关心的 java.util.Date 来自 mysql DB 中的 DATE 字段,通过旧版 API,实际上是 java.sql.Date。
现在以下相关问题都很有趣:
UnsupportedOperationException - Why can't you call toInstant() on a java.sql.Date?
Convert java.util.Date to java.time.LocalDate
LocalDate to java.util.Date and vice versa simplest conversion?
但它们没有提供任何优雅的方式来截断 java.util.Date 以摆脱时间组件并获得 Java 8 LocalDate。
我承认存在一个问题,即一个时区的同一时刻可能与另一个时区的同一时刻的日期不同。
我怀疑该解决方案将涉及 java.util.Calendar,但与其制定我自己的解决方案,我宁愿先确定其他人已经完成了什么。
我希望找到比这更短的:
来自Resetting the time part of a timestamp in Java:
Date date = new Date(); // timestamp now Calendar cal = Calendar.getInstance(); // get calendar instance cal.setTime(date); // set cal to date cal.set(Calendar.HOUR_OF_DAY, 0); // set hour to midnight cal.set(Calendar.MINUTE, 0); // set minute in hour cal.set(Calendar.SECOND, 0); // set second in minute cal.set(Calendar.MILLISECOND, 0); // set millis in second Date zeroedDate = cal.getTime(); // actually computes the new Date
【问题讨论】:
-
LocalDate date = ((java.sql.Date) input).toLocalDate();还不够吗? -
@VGR 没错。在使用
toInstant()时,JavaDoc 说:此方法总是抛出 UnsupportedOperationException 并且不应使用,因为 SQL 日期值没有时间组件。 -
@Hugo 它也可能不是是
java.sql.Date -
我认为您的问题在于继承关系具有欺骗性:它表明您应该能够统一和多态地处理
Date类型,这不是故意的。
标签: java date datetime java-time date-conversion