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

时间:2019-04-12 09:53:20

标签: java timestamp

我需要将毫秒数缩短为几秒,并以这种方式实现它:

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

3 个答案:

答案 0 :(得分:1)

java.time

我假设您正在要求将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.Timestampjava.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)。