在 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);
在 Africa/Blantyre 时区运行时的输出(只是随机选择一个时区):
2019-11-29T22:00Z
我的方法接受一个 LocalDate
参数。 LocalDate
是一个没有时间的日期,并且是该方法所需的全部内容,因为无论如何它将时间设置为 00:00:00。
如果您的数据库需要一个没有时区的时间戳
(不推荐),您将需要一个LocalDateTime
:
private LocalDateTime resetTime(LocalDate date) {
return date.atStartOfDay();
}
I was going to use the Calendar class but then read that it is advisable not to do so in Java 8.
你是完全正确的。在 2014 年 java.time 出现之前,Timestamp
类与 SQL 数据库一起使用,而 Calendar
类将是您完成任务的正确方法(使用 Joda-Time图书馆作为一个可能更好的选择)。尽管 Timestamp
和 Calendar
都设计得很糟糕。现在它们已经过时了,我们不应该再使用它们了。
链接: Oracle tutorial: Date Time解释如何使用 java.time。
关于java - 在 Java 8 中重置时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59114463/