当前位置: 首页 > 知识库问答 >
问题:

Java8java.time:在Instant与LocalDateTime中添加TemporalUnit

洪璞瑜
2023-03-14

我正在使用Java8中的新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(dueInstant.toEpochMilli());
}

现在,这是我第一次使用新的time API,所以我可能在这里遗漏了一些东西。但对我来说,我必须走,这似乎很笨拙:

Date --> Instant --> LocalDateTime --> do stuff--> Instant --> Date.

即使我不必使用日期部分,我仍然会觉得这有点尴尬。所以我的问题是,我这样做是不是完全错了,最好的方法是什么?

编辑:在评论中展开讨论。

新问题。从本地时间到UTC的隐式转换在哪里发生?保存时区的更好方法是什么。我不应该直接从本地时间作为字符串(2014-04-16T13:00)转到LocalDateTime吗?我应该期待用户输入的时区吗?

共有1个答案

唐弘和
2023-03-14

我将继续并张贴一个答案的基础上,我的最终解决方案和一种总结的很长的评论链。

首先,整个转换链:

Date --> Instant --> LocalDateTime --> Do stuff --> Instant --> Date

是必要的,以保留时区信息,并仍然在一个像日期一样的对象上执行操作,该对象知道日历和其中的所有上下文。否则,我们会冒隐式转换为本地时区的风险,如果我们试图将其转换为人类可读的日期格式,时间可能会因此而改变。

//Parse string into local date. LocalDateTime has no timezone component
LocalDateTime time = LocalDateTime.parse("2014-04-16T13:00:00");

//Convert to Instant with no time zone offset
Instant instant = time.atZone(ZoneOffset.ofHours(0)).toInstant();

//Easy conversion from Instant to the java.sql.Timestamp object
Timestamp timestamp = Timestamp.from(instant);
Timestamp timestamp = ...

//Convert to LocalDateTime. Use no offset for timezone
LocalDateTime time = LocalDateTime.ofInstant(timestamp.toInstant(), ZoneOffset.ofHours(0));

//Add time. In this case, add one day.
time = time.plus(1, ChronoUnit.DAYS);

//Convert back to instant, again, no time zone offset.
Instant output = time.atZone(ZoneOffset.ofHours(0)).toInstant();

Timestamp savedTimestamp = Timestamp.from(output);
Timestamp timestamp = ....
LocalDateTime time = LocalDateTime.ofInstant(timestamp.toInstant(), ZoneOffset.ofHours(0));
String formatted = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(time);
 类似资料:
  • 问题内容: 我正在使用Java 8中的新java.time包。我有一个遗留数据库,可以将其转换为。 我想做的是添加一个基于另一个数据库标志的时间段。我可能要加上几天,几周,几个月或几年。我不想关心我要添加的内容,并且希望将来能够添加更多选项。 我的第一个想法是,但这给了我大于一天的价值。即时显然不支持大时间单位上的操作。好吧,随便吧。 因此,我得到了以下代码: 现在,这是我第一次使用新的time

  • 将以下内容添加到对象映射器: 任何帮助或指点我的错误将是感激的。

  • 问题内容: 我知道: 即时是用于计算的“技术”时间戳表示(纳秒)。 LocalDateTime是日期/时钟表示形式,包括人类的时区。 最后,对于大多数应用程序用例,IMO都可以视为两种类型。例如:当前我正在运行一个批处理作业,我需要根据日期计算下一次运行,并且我正在努力寻找这两种类型之间的优缺点(除了Instant和时区部分的纳秒级精度优势)的LocalDateTime)。 您可以列举一些应用示例

  • 我知道: 即时是一种用于计算的“技术性”时间戳表示(纳秒)。 LocalDateTime是包含人类时区的日期/时钟表示形式。 最终,IMO两者都可以作为大多数应用程序用例的类型。例如:当前,我正在运行一个批处理作业,需要根据日期计算下一次运行,我正在努力寻找这两种类型之间的优劣(除了Instant的纳秒精度优势和LocalDateTime的时区部分)。

  • 我试过如下所示,但在两种情况下显示的时间都是相同的?我做错了什么。 “当前日期”时间显示与“12小时后”相同...

  • 在以下情况下,哪些可用的java 8时间API类最适合JPA实体映射: 按信息类型创建的合同 日期以UTC格式存储在数据库中 业务逻辑以UTC进行所有计算 日期显示在欧洲/维也纳时区的UI中 我看到的大多数示例都使用LocalDateTime,但其中一个没有任何时区的概念。既然我们的所有业务逻辑都应该在UTC中进行计算,并在UTC中检索/存储数据,那么Instant或ZonedDateTime不是

  • 问题内容: 我正在学习Docker,并且对何时何地使用and 有疑问。我认为这两个都是这样做的: 加 在构建时将文件复制到映像。该映像包含所有文件,因此您可以非常轻松地进行部署。另一方面,在开发中每次都需要构建似乎不是一个好主意,因为构建需要开发人员运行命令来重建容器。另外,建造容器可能很耗时。 体积 我了解您可以使用容器文件夹安装主机文件夹,这样您就可以轻松地修改文件并观察容器中的应用对更改的反

  • 这款取色器名字叫做Instant Eyedropper ,是一款windows下的免费取色软件,体积也很小,375KB。这个东西虽然功能简单,但是很好用,在你设计开发页面的时候可以帮助你节省不少时间。 安装完毕之后运行该软件,你会发现windows右下角的系统托盘中多了一个圆形图标,鼠标左键点击它,就会看到取色的界面,左边是一个放大镜,右边就是数值,如下图