Java 8中的java.time:在Instant vs LocalDateTime中添加TemporalUnit
Java 8中的java.time:在Instant vs LocalDateTime中添加TemporalUnit
我正在尝试使用Java 8中的新java.time包。我有一个旧的数据库,它给我提供了java.util.Date
,我将其转换为Instant
。
我想要做的是根据另一个数据库标志添加一段时间。我可以添加天、周、月或年。我不想关心我添加了什么,我希望将来能够添加更多选项。
我最初想到的是使用Instant.plus()
,但对于大于一天的值,它会抛出UnsupportedTemporalTypeException
异常。显然,Instant不支持大单位的时间操作。好吧,没关系,LocalDateTime
可以。
所以我写了这段代码:
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(updatedInstant.toEpochMilli()); }
现在,这是我第一次使用新的时间API,所以我可能漏掉了一些东西。但是对我来说,不管怎么说,我觉得这很笨拙,我必须经历以下过程:
Date --> Instant --> LocalDateTime --> 做一些处理 --> Instant --> Date。
即使我不需要使用Date部分,我仍然认为这有点尴尬。所以我的问题是,我是完全错了吗?有什么更好的方法吗?
编辑:根据评论中的讨论进行扩展。
现在我对LocalDateTime和Instant如何与java.util.Date和java.sql.Timestamp进行交互有了更好的理解。谢谢大家。
现在,一个更实际的考虑。假设用户从世界上的任何地方向我发送一个日期,任意时区。他们发送给我2014-04-16T13:00:00
,我可以将其解析为LocalDateTime。然后,我直接将其转换为java.sql.Timestamp并存储在我的数据库中。
现在,不做任何其他操作,我从数据库中提取我的java.sql.timestamp,使用timestamp.toLocalDateTime()
转换为LocalDateTime
。一切都好。然后,我使用ISO_DATE_TIME格式将此值返回给用户。结果是2014-04-16T09:00:00
。
我认为这种差异是由于某种隐式的本地时间到UTC的转换引起的。我想我的默认时区可能被应用于该值(EDT,UTC-4),这就解释了为什么数字差了4个小时。
新的问题。在这里,本地时间到UTC的隐式转换发生在哪里?保留时区的更好方法是什么?我不应该直接从本地时间作为字符串(2014-04-16T13:00:00)转换为LocalDateTime
吗?我应该从用户输入中期望一个时区吗?