Java 8中的重置时间戳

问题描述 投票:0回答:1

用Java 8编写以下代码段的最佳方法是什么?

private Timestamp resetTime(Timestamp ts) {
    ts.setHours(0);
    ts.setMinutes(0);
    ts.setSeconds(0);   
    return ts;
}

我本打算使用Calendar类,但随后建议不要在Java 8中使用它。任何帮助将不胜感激。谢谢。

java java-8 calendar timestamp reset
1个回答
0
投票

您的代码似乎试图在默认时区中将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库可能是更好的选择)。即使TimestampCalendar的设计都不好。现在它们已经过时了,我们不应该再使用它们。

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

© www.soinside.com 2019 - 2024. All rights reserved.