如何将秒转换为java.sql.Timestamp?

如何将秒转换为java.sql.Timestamp?,java,timestamp,Java,Timestamp,我需要将毫秒截断为秒,并以这种方式实现它: private static Long millisToSeconds(Long millisValue) { return TimeUnit.MILLISECONDS.toSeconds(millisValue); } 因此,现在它按预期截断毫秒,例如: Long secondsValue = millisToSeconds(1554052265830L); System.out.println("millisToSeconds ---&g

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

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[.fffffff]


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

您可以使用
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);

错误表明您正在使用
Timestamp.valueOf(String)
(可能使用
secondsValue.toString()
作为参数?)

java.sql.Timestamp
java.util.Date
的一个特殊版本,具有纳秒精度,可以序列化/反序列化sql
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

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驱动程序在将
即时
传递给
PreparedStatement.setObject
(该方法的重载版本之一)时直接接受它,即使JDBC规范不要求这样做。如果没有,请使用
OffsetDateTime
。像这样转换:

    OffsetDateTime odt = i.atOffset(ZoneOffset.UTC);
    System.out.println(odt);
2019-03-31T17:11:05Z

您可以看到,值仍然相同,只是类型不同

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

首先,正如我所说的,您应该修复代码,使其不需要时间戳,但您也在问不可能的问题。据我所知,
Timestamp.toString
始终会在秒数上产生至少一个小数点,因此它至少看起来像
2019-03-31 11:45:06.0

如果您确实需要一个
时间戳
作为您现在不能或不想更改的遗留API,请从以前转换
即时

    Timestamp ts = Timestamp.from(i);
    System.out.println(ts);
2019-03-3119:11:05.0

不要被时间的不同所愚弄(19:11而不是17:11)<代码>时间戳打印在我的本地时区,即欧洲/哥本哈根,比UTC早2小时,因为夏季时间(DST)从3月31日开始。因此,我们仍然有相同的时间点


链接:解释如何使用java.time。

…但是下面的实现会导致…
哪种实现?我认为您缺少一些代码。根据一个
时间戳(长时间)
构造函数,它
使用毫秒时间值构造一个时间戳对象。
所以您需要做的就是将
秒值
乘以1000,如果没有代码,很难知道如何修复它。可以吗?我建议您不要使用
java.sql.Timestamp
。那门课设计得很糟糕,而且早已过时。相反,根据您的数据库数据类型和JDBC驱动程序的功能,请使用
OffsetDateTime
Instant
LocalDateTime
,所有这些都来自。提示:使用原语
long
(小写
l
)而不是
long
对象。如果要获取字符串,然后应该使用
java.util.Date
(或者更好:一个
java.time
类而不是
java.sql.Timestamp
请不要教年轻人使用早已过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选项。也不是毫无保留的。今天,我们的
DateTimeFormat及其
DateTimeFormatte有了很多更好的选择。)r
。假设SQL数据库要求使用
时间戳
,则不应使用字符串。顺便说一句,您的代码是错误的。我得到了
1970-40-19 12:40:52
,这不可能是正确的。