2011-10-02 102 views
26

得到一个以此格式进入的字符串:YYYY-MM-DD-HH.MM.SS.NNNNNN时间戳记来自DB2数据库。我需要将它解析成java.sql.Timestamp并且不会失去任何准确性。到目前为止,我一直无法找到现有的代码来解析这一点到微秒。 SimpleDateFormat返回一个Date并且仅解析为毫秒。简短地看了一下JodaTime,并没有看到这可以起作用。将Java字符串转换为sql.Timestamp

+2

如果时间戳来自一个DB2数据库,你为什么要读它作为一个字符串,而不是看它作为时间戳直接? –

+1

时间戳记来自数据库,客户端将其返回给我们进行密钥读取。 – Dan

+1

如果您使用时间戳进行键读,并且您大概首先将其发送给客户端,则可以考虑将其转换为长纳秒,然后将其读回,而不是字符串值。即发出'long l = ts.getTime()',然后用'new Timestamp(l)'读回它。你甚至可以序列化这个值来节省线上的空间(但在这种情况下你会失去人的可重写性)。 – Luciano

回答

58

您是否尝试过使用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); 
} 

另外,通过采取串并使用约达时间或SimpleDateFormat解析到毫秒(我喜欢极大时间约达,但你的里程可能会有所不同)。然后将字符串的其余部分作为另一个字符串并使用Integer.parseInt进行解析。然后您可以很容易地将这些值组合起来:

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

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

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

7

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

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

1

我相信你需要这样做:

  1. 使用的SimpleDateFormat等来everythingDate转换everythingButNano。使用Long.valueof(纳米)
  2. 转换everythingDate用新的时间戳时间戳(everythingDate.getTime())
  3. 将TIMESTAMP纳秒与Timestamp.setNano()

选项

  • 转换纳米2 转换为Jon Skeet的答案中指出的日期格式并使用它。

  • 4

    这里是预期的方式做到这一点:

    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更慢的所有服务,这是所有你需要的,尤其是因为大多数机器甚至不追踪到实际的纳秒。

    1

    如果你有时间的格式字符串,如1441963946053,你根本就做一些事情如下:

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