我需要将毫秒数缩短为几秒,并以这种方式实现它:
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: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
在我的实现中应解决什么问题,以将秒转换为时间戳,以使最终的时间戳看起来像2019-03-31 11:45:06
?
答案 0 :(得分:1)
我假设您正在要求将java.sql.Timestamp
用于SQL数据库。在大多数情况下,您不应该要求这样做。 Timestamp
类的设计欠佳且已过时,现代JDBC驱动程序或JPA实现将很乐意接受现代Java日期和时间API java.time中的类型。
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
(该方法的重载版本之一)时会直接接受OffsetDateTime
,即使JDBC规范对此没有要求。如果不是,请改用 OffsetDateTime odt = i.atOffset(ZoneOffset.UTC);
System.out.println(odt);
。像这样转换:
2019-03-31 11:45:06
2019-03-31T17:11:05Z
您可以看到值仍然相同,只是类型不同。
我应该在实现中解决哪些问题,以将秒转换为时间戳 这样生成的时间戳看起来像
Timestamp
吗?
首先,正如我所说,您应该修正代码,使其不要求Timestamp.toString
,但同时您也在问不可能的问题。据我所知,2019-03-31 11:45:06.0
总是在秒数上至少产生一个小数,因此看起来至少像Timestamp
。
如果您需要必不可少的{@ {1}}用于遗留的API,而您现在不能或不想更改,请从之前转换Instant
:>
Timestamp ts = Timestamp.from(i);
System.out.println(ts);
2019-03-31 19:11:05.0
别被看起来不同的时间所迷惑(19:11而不是17:11)。 Timestamp
在我的当地时区(欧洲/哥本哈根)打印,比夏时制(DST)于3月31日开始的夏令时早2小时。所以我们仍然有相同的时间点。
链接: Oracle tutorial: Date Time解释了如何使用java.time。
答案 1 :(得分:0)
您可以根据需要使用SimpleDateFormat
设置日期格式。见下文
Long secondsValue = millisToSeconds(1554052265830L);
System.out.println("millisToSeconds ---> " + secondsValue);
Timestamp timeStamp = new Timestamp(secondsValue);
String formattedDate = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(timeStamp.getTime());
System.out.println(formattedDate);
答案 2 :(得分:0)
该错误表明您正在使用Timestamp.valueOf(String)
(可能以secondsValue.toString()
作为参数?)。
java.sql.Timestamp
是java.util.Date
的特殊版本,具有纳秒级精度,可以对SQL TIMESTAMP
值进行序列化/反序列化。根本不是第二个值。
constructor of Timestamp
采用毫秒值,而不是秒值(对于纳秒精度,您需要使用单独的setNanos
和亚秒级纳秒)。
无论如何,正确的方法是使用:
long milliseconds = ...;
long seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds);
long truncatedMilliseconds = TimeUnit.SECONDS.toMillis(seconds);
// or truncatedMilliseconds = (milliseconds / 1000) * 1000;
Timestamp value = new Timestamp(truncatedMilliseconds);
但是,由于您在谈论需要一种特定的字符串格式,因此我不确定您是否完全需要这种格式。除非您使用JDBC将这个值存储在数据库中,否则根本不应该使用java.sql.Timestamp
(即使使用JDBC,也最好使用java.time.LocalDatetime
)。>