【发布时间】:2018-01-31 15:10:33
【问题描述】:
我想根据一些逻辑从Java的数据库中的datetime数据类型的列中插入一个值。
逻辑: 如果该月的日期是 29、30 或 31,则输入下个月的 28 日。否则放入下个月的同一天。
例如如果日期为2017-08-31,则进入数据库的日期将为2017-09-28。但是,如果日期是2017-08-27,则进入数据库的日期将为2017-09-27。
我还想要UTC 中的所有内容。
我正在尝试的代码是这样的:
ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneOffset.UTC);
utcDateTime = utcDateTime.plusMonths(1);
if(utcDateTime.getDayOfMonth() >= 29){
utcDateTime = utcDateTime.withDayOfMonth(28);
Timestamp time = Timestamp.from(utcDateTime.toInstant());
System.out.println(time); // DB insert here
}else{
Timestamp time = Timestamp.from(utcDateTime.toInstant());
System.out.println(time); // DB insert here
}
问题:这是最正确的方法,还是使用Instant(始终使用 UTC)有更简单的 Java 8 方法?我没有任何方法可以直接从Instant 对象获取月份中的某天,也无法将月份添加到Instant 对象。
【问题讨论】:
-
不考虑所有可能性,您的代码立即看起来不错。
Instant不太适合您需要的日期算术,因此最好使用另一个类。我会考虑OffsetDateTime而不是ZonedDateTime。 -
您需要一天中的时间吗?如果不是,使用
LocalDate可能更正确(即使转换为Instant有点不那么直接)。此外,您可能想解释为什么要回到 9 月 28 日,因为 9 月有 30 天;好像有点搞笑?
标签: java sql-server date datetime java-time