我需要将毫秒截断为秒并以这种方式实现它:
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。