java - 在 Java 8 中重置时间戳

标签 java java-8 calendar timestamp reset

在 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图书馆作为一个可能更好的选择)。尽管 TimestampCalendar 都设计得很糟糕。现在它们已经过时了,我们不应该再使用它们了。

链接: Oracle tutorial: Date Time解释如何使用 java.time。

关于java - 在 Java 8 中重置时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59114463/

相关文章:

php - 从数据库创建的动态 ical 不起作用

java - 类型转换 Map<String, String> 到 Map<Object, Object>

java - 加密在唯一文件中附加包装 key 的文件

java - SSLHandshakeException : Handshake failed SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER

java - 如何有效地从java LinkedList中删除一个元素

java - 使用 JVM Nashorn (Play Framework) 呈现 React.js 时出错。我得到 "null is not a function"

java - 是否有任何基准比较 Java 8 Streams 和 Guava Iterables?

java - JDK 日期格式解析德语语言环境中的星期几,java 8 与 java 9

php - 如何从 MySql 获取给定开始和结束日期的结果?

Java - 创建日期列表