Java 8中的java.time:在Instant vs LocalDateTime中添加TemporalUnit

10 浏览
0 Comments

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吗?我应该从用户输入中期望一个时区吗?

0