我收到的字符串格式为: YYYY-MM-DD-HH.MM.SS.NNNNNN。这个时间戳来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不会失去任何精度。到目前为止,我无法找到现有的代码可以解析到微秒。SimpleDateFormat只返回Date并仅解析到毫秒。简要地查看了JodaTime,也没有找到合适的解决方案。
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);
Timestamp.valueOf(String)
。文档说明它能够理解格式为yyyy-mm-dd hh:mm:ss[.f...]
的时间戳,因此你可能需要更改传入字符串中的字段分隔符。setNanos
方法来存储微秒。以下是将字符串转换为日期的正确方式:
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更慢的服务中,这就足够了,尤其是因为大多数计算机甚至不需要追踪到实际的纳秒。
如果你获得的时间是以1441963946053这样的格式表示的字符串,你可以按照以下方式进行操作:
//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);
我认为你需要这样做:
选项2:将其转换为Jon Skeet答案中指出的日期格式并使用它。
long l = ts.getTime()
,然后使用new Timestamp(l)
进行读取。您甚至可以序列化此值以节省网络空间(但在这种情况下,您会失去人类可读性)。 - Luciano