将Java字符串转换为SQL时间戳

49

我收到的字符串格式为: YYYY-MM-DD-HH.MM.SS.NNNNNN。这个时间戳来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不会失去任何精度。到目前为止,我无法找到现有的代码可以解析到微秒。SimpleDateFormat只返回Date并仅解析到毫秒。简要地查看了JodaTime,也没有找到合适的解决方案。


2
如果时间戳来自DB2数据库,为什么您要将其读取为字符串而不是直接读取为Timestamp呢? - JB Nizet
1
时间戳来自数据库,客户端将其返回给我们进行键控读取。 - Dan
1
如果您正在使用时间戳进行键控读取,并且您可能首先将其发送到客户端,那么您可以考虑将其转换为纳秒长整型,然后再进行读取,而不是字符串值。例如,发送 long l = ts.getTime(),然后使用 new Timestamp(l) 进行读取。您甚至可以序列化此值以节省网络空间(但在这种情况下,您会失去人类可读性)。 - Luciano
如果我的字符串不是这种格式,而是 mm/dd/yyyy hh:mm 格式,那么如何转换为时间戳格式? - kavinder
更新:Java 8中内置的新Java.time包处理纳秒分辨率。根据您的情况,可能比处理java.sql.Timestamp更容易/更好。您也可以将java.time和java.sql.Timestamp相互转换。 - Basil Bourque
5个回答

84
你尝试过使用Timestamp.valueOf(String)吗?它看起来几乎可以完全满足你的需求 - 你只需要将日期和时间之间的分隔符更改为一个空格,将小时和分钟以及分钟和秒钟之间的分隔符更改为冒号即可:
import java.sql.*;

public class Test {
    public static void main(String[] args) {
        String text = "2011-10-02 18:48:05.123456";
        Timestamp ts = Timestamp.valueOf(text);
        System.out.println(ts.getNanos());
    }
}

假设您已经验证了字符串的长度,这将转换为正确的格式:

static String convertSeparators(String input) {
    char[] chars = input.toCharArray();
    chars[10] = ' ';
    chars[13] = ':';
    chars[16] = ':';
    return new String(chars);
}

另一种方法是通过取子字符串并使用Joda Time或SimpleDateFormat解析为毫秒(我非常喜欢Joda Time,但您的看法可能不同)。然后将余下的字符串作为另一个字符串进行解析,使用Integer.parseInt。您可以很容易地组合这些值:

Date date = parseDateFromFirstPart();
int micros = parseJustLastThreeDigits();

Timestamp ts = new Timestamp(date.getTime());
ts.setNanos(ts.getNanos() + micros * 1000);

1
Timestamp.valueOf(String) 如何处理时区? - fudy

9
你可以使用Timestamp.valueOf(String)。文档说明它能够理解格式为yyyy-mm-dd hh:mm:ss[.f...]的时间戳,因此你可能需要更改传入字符串中的字段分隔符。
另一方面,如果你要这样做,那么你可以自己解析并使用setNanos方法来存储微秒。

Timestamp.valueOf("2015/06/08".replaceAll("/", "-") + " 00:00:00") 时间戳.valueOf("2015/06/08".replaceAll("/", "-") + " 00:00:00") - Paul

8

以下是将字符串转换为日期的正确方式:

String timestamp = "2011-10-02-18.48.05.123";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk.mm.ss.SSS");
Date parsedDate = df.parse(timestamp);

诚然,它只有毫秒级的分辨率,但在所有比Twitter更慢的服务中,这就足够了,尤其是因为大多数计算机甚至不需要追踪到实际的纳秒。


这会给你 java.util.Date,但请求是创建 java.sql.Timestamp。此外,问题是在 Java 中,而要求使用 Scala。 - Paul
你在第一个观点上是正确的,但问题从未提到过Scala,而且标记为Java。实际上,据我所知,你的评论是整个页面中唯一提到Scala的文字。 - Ky -
1
抱歉,我弄混了另一个要求明确使用Scala的问题。当他们允许我时,我会取消我的反对票。 - Paul

2

如果你获得的时间是以1441963946053这样的格式表示的字符串,你可以按照以下方式进行操作:

//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);

但是你没有以这种格式获取日期,请参考问题。 - Paul

1

我认为你需要这样做:

  1. 使用SimpleDateFormat或类似工具将everythingButNano转换为everythingDate。
  2. 使用Long.valueof(nano)将nano转换为长整型。
  3. 使用new Timestamp(everythingDate.getTime())将everythingDate转换为Timestamp类型。
  4. 使用Timestamp.setNano()设置Timestamp的纳秒值。

选项2:将其转换为Jon Skeet答案中指出的日期格式并使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接