我正在使用 Java 8 中的新 java.time 包。我有一个遗留数据库,它为我提供了java.util.Date
,我将其转换为Instant
.
我想做的是添加基于另一个数据库标志的一段时间。我可以添加天、周、月或年。我不想关心我要添加的内容,并且我希望将来能够添加更多选项。
我的第一个想法是Instant.plus()
,但这给了我一个UnsupportedTemporalTypeException
对于大于一天的值。 Instant 显然不支持大时间单位的操作。好吧,无论如何,LocalDateTime
does.
所以这给了我这个代码:
private Date adjustDate(Date myDate, TemporalUnit unit){
Instant instant = myDate.toInstant();
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
dateTime = dateTime.plus(1, unit);
Instant updatedInstant = dateTime.atZone(ZoneId.systemDefault()).toInstant();
return new Date(dueInstant.toEpochMilli());
}
现在,这是我第一次使用新的时间 API,所以我可能在这里错过了一些东西。但我必须去,这对我来说似乎很笨拙:
Date --> Instant --> LocalDateTime --> do stuff--> Instant --> Date.
即使我不必使用 Date 部分,我仍然会觉得这有点尴尬。所以我的问题是,我这样做完全错误吗?最好的方法是什么?
Edit:扩展评论中的讨论。
我想我现在对 LocalDateTime 和 Instant 如何使用 java.util.Date 和 java.sql.Timestamp 有了更好的了解。感谢大家。
现在,有一个更实际的考虑。假设用户向我发送了来自世界任何地方、任意时区的日期。他们送我2014-04-16T13:00:00
我可以将其解析为 LocalDateTime。然后,我将其直接转换为 java.sql.Timestamp 并保留在我的数据库中。
现在,无需执行任何其他操作,我从数据库中提取 java.sql.timestamp,转换为LocalDateTime
using timestamp.toLocalDateTime()
。都好。然后我使用 ISO_DATE_TIME 格式将此值返回给我的用户。结果是2014-04-16T09:00:00
.
我认为这种差异是由于某种类型的 UTC 隐式转换造成的。我认为我的默认时区可能会应用于该值(EDT、UTC-4),这可以解释为什么该数字相差 4 小时。
新问题。从本地时间到 UTC 的隐式转换发生在哪里?保留时区的更好方法是什么?我是否应该直接从当地时间作为字符串 (2014-04-16T13:00:00) 到LocalDateTime
?我应该从用户输入中期待时区吗?