将Java String转换为sql.Timestamp

Dan*_*Dan 34 java string parsing timestamp

得到一个字符串以这种格式进入:YYYY-MM-DD-HH.MM.SS.NNNNNN时间戳来自DB2数据库.我需要将其解析为java.sql.Timestamp并且不会丢失任何精度.到目前为止,我一直无法找到现有的代码来解析那么远的微秒.SimpleDateFormat返回Date并仅解析为毫秒.简短地看着JodaTime,并没有看到那也行.

Jon*_*eet 74

你试过用过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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

或者,通过采用子串并使用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);
Run Code Online (Sandbox Code Playgroud)


Cam*_*ner 9

你可以用Timestamp.valueOf(String).文档说明它理解格式中的时间戳yyyy-mm-dd hh:mm:ss[.f...],因此您可能需要更改传入字符串中的字段分隔符.

然后,如果你要这样做,那么你可以自己解析它并使用该setNanos方法来存储微秒.


Sup*_*tar 5

这是将字符串转换为日期的预期方法:

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);
Run Code Online (Sandbox Code Playgroud)

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