2011-10-02 51 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);