用Java 8编写以下代码段的最佳方法是什么?
private Timestamp resetTime(Timestamp ts) {
ts.setHours(0);
ts.setMinutes(0);
ts.setSeconds(0);
return ts;
}
我本打算使用Calendar类,但随后建议不要在Java 8中使用它。任何帮助将不胜感激。谢谢。
您的代码似乎试图在默认时区中将Timestamp
对象调整为一天的开始(并不是在所有情况下都可以做到这一点。)>
[过去,我们使用Timestamp
将值传输到带或不带时区的SQL时间戳。后者有点自相矛盾:应该以时间戳记来定义时间点,但是没有时区或UTC偏移量的日期和时间不能做到这一点。因此,首先假设您希望将值传输到需要timestamp with time zone
的SQL数据库。在Java 8中使用的类型(假设JDBC 4.2或更高版本的驱动程序)为OffsetDateTime
(某些JDBC驱动程序也接受Instant
)。由于我所知道的数据库始终将UTC用作时区,因此我发现在UTC中传输OffsetDateTime
最自然,也最不容易混淆。
private OffsetDateTime resetTime(LocalDate date) { return date.atStartOfDay(ZoneId.systemDefault()) .toOffsetDateTime() .withOffsetSameInstant(ZoneOffset.UTC); }
示例用法:
OffsetDateTime ts = resetTime(LocalDate.of(2019, Month.NOVEMBER, 30)); System.out.println(ts);
在非洲/布兰太尔时区中运行时的输出(只是随机选择一个时区):
2019-11-29T22:00Z
我的方法接受LocalDate
参数。 LocalDate
是没有日期的日期,并且因为该方法将日期设置为00:00:00,所以该方法所需的全部。
如果您的数据库需要不带时区的timestamp
(不建议),则将需要LocalDateTime
:
private LocalDateTime resetTime(LocalDate date) { return date.atStartOfDay(); }
我本打算使用Calendar类,但随后看到它是建议不要在Java 8中这样做。
您完全正确。在2014年java.time出现之前,Timestamp
类已用于SQL数据库,而Calendar
类将是完成任务的正确方法(使用Joda-Time库可能是更好的选择)。即使Timestamp
和Calendar
的设计都不好。现在它们已经过时了,我们不应该再使用它们。
Link: Oracle tutorial: Date Time解释如何使用java.time。