我需要将毫秒截断为秒并以这种方式实现它:

private static Long millisToSeconds(Long millisValue) { 
    return TimeUnit.MILLISECONDS.toSeconds(millisValue); 
} 

现在它按预期截断毫秒,例如:

Long secondsValue = millisToSeconds(1554052265830L); 
System.out.println("millisToSeconds ---> " + toSeconds);  
// Prints millisToSeconds ---> 1554052265 

但是后来我想将 secondsValue 转换为 java.sql.Timestamp 但以下实现会导致错误:

java.lang.IllegalArgumentException:时间戳格式必须为 yyyy-mm-dd hh:mm:ss[.fffffffff]

我应该在实现中修复什么才能将秒转换为时间戳,以便生成的时间戳看起来像 2019-03-31 11:45:06

请您参考如下方法:

java.time

我假设您要求 java.sql.Timestamp与您的 SQL 数据库一起使用。在大多数情况下,您不应该提出这样的要求。 Timestamp类设计不佳且早已过时,而现代 JDBC 驱动程序或 JPA 实现将很乐意接受来自 java.time(现代 Java 日期和时间 API)的类型。

    long millisValue = 1_554_052_265_830L; 
    Instant i = Instant.ofEpochMilli(millisValue); 
    i = i.truncatedTo(ChronoUnit.SECONDS); 
    System.out.println(i); 

2019-03-31T17:11:05Z

我不知道你为什么要截断为秒,但你可以看到它已经完成(或者很容易忽略该行)。

某些 JDBC 驱动程序接受 Instant当您将其传递给PreparedStatement.setObject时直接(该方法的重载版本之一)即使 JDBC 规范不要求这样做。如果您没有,请使用 OffsetDateTime反而。像这样转换:

    OffsetDateTime odt = i.atOffset(ZoneOffset.UTC); 
    System.out.println(odt); 

2019-03-31T17:11:05Z

可以看到值还是一样的,只是类型不同。

What should I fix in my implementation to convert seconds to timestamp so that the resulting timestamp looks like 2019-03-31 11:45:06 ?

首先,正如我所说,您应该修复您的代码,使其不需要 Timestamp ,但你也在问不可能的事情。据我所知,Timestamp.toString总是会在秒上产生至少一位小数,所以它至少看起来像 2019-03-31 11:45:06.0 .

如果您确实必不可少地需要 Timestamp对于您现在无法或不想更改的旧版 API,请转换 Instant从之前:

    Timestamp ts = Timestamp.from(i); 
    System.out.println(ts); 

2019-03-31 19:11:05.0

不要被看似不同的时间所欺骗(19:11 而不是 17:11)。 Timestamp打印在我本地的时区,即欧洲/哥本哈根,自 3 月 31 日开始夏令时 (DST) 以来,比 UTC 早 2 小时。所以我们仍然得到相同的时间点。

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!