Converti stringa Java in sql.Timestamp

Ottenuto una stringa in arrivo con questo formato: AAAA-MM-GG-HH.MM.SS.NNNNNNN Il Timestamp proviene da un database DB2. Ho bisogno di analizzarlo in un java.sql.Timestamp e NON perdere alcun precison. Finora non sono stato in grado di trovare il codice esistente per analizzarlo fino a pochi microsecondi. SimpleDateFormat restituisce una data e analizza solo in millisecondi. Guardò JodaTime brevemente e non vide che avrebbe funzionato neanche.

Hai provato a utilizzare Timestamp.valueOf(String) ? Sembra che dovrebbe fare quasi esattamente quello che vuoi – devi solo cambiare il separatore tra la data e l’ora in uno spazio, e tra ore e minuti, minuti e ore, a due punti:

 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()); } } 

Supponendo che tu abbia già convalidato la lunghezza della stringa, questo verrà convertito nel formato corretto:

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

In alternativa, analizza fino al millisecondo prendendo una sottostringa e utilizzando Joda Time o SimpleDateFormat (preferisco di gran SimpleDateFormat Joda Time, ma il tuo chilometraggio può variare). Quindi prendi il resto della stringa come un’altra stringa e analizzala con Integer.parseInt . È quindi ansible combinare i valori abbastanza facilmente:

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

È ansible utilizzare Timestamp.valueOf(String) . La documentazione afferma che comprende i timestamp nel formato yyyy-mm-dd hh:mm:ss[.f...] , quindi potrebbe essere necessario modificare i separatori di campo nella stringa in entrata.

Quindi, se lo farai, potresti analizzarlo da solo e usare il metodo setNanos per memorizzare i microsecondi.

Ecco il modo previsto per farlo:

 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); 

Certo, ha solo una risoluzione di millisecondo, ma in tutti i servizi più lenti di Twitter, è tutto ciò di cui avrete bisogno, specialmente dal momento che la maggior parte delle macchine non rintracciano nemmeno gli attuali nanosecondi.

Se si ottiene il tempo come stringa in formato come 1441963946053, si potrebbe semplicemente fare qualcosa come segue:

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

Credo che tu debba fare questo:

  1. Converti tuttoButNano usando SimpleDateFormat o simile a everythingDate.
  2. Converti nano usando Long.valueof (nano)
  3. Converti tutto Date in un Timestamp con il nuovo Timestamp (everythingDate.getTime ())
  4. Imposta i nanori Timestamp con Timestamp.setNano ()

Opzione 2 Converti nel formato data indicato nella risposta di Jon Skeet e usalo.