it-swarm.com.de

Konvertieren Sie Java String in sql.Timestamp

Es wurde eine Zeichenfolge im folgenden Format eingegeben: JJJJ-MM-TT-HH.MM.SS.NNNNNN Der Zeitstempel stammt aus einer DB2-Datenbank. Ich muss es in einen Java.sql.Timestamp analysieren und keine Präzision verlieren. Bisher konnte ich keinen Code finden, der so weit in Mikrosekunden zerlegt werden kann. SimpleDateFormat gibt ein Datum zurück und analysiert nur Millisekunden. Sah JodaTime kurz an und sah nicht, dass das auch funktionieren würde.

33
Dan

Haben Sie versucht, Timestamp.valueOf(String) zu verwenden? Es sieht so aus, als sollte es fast genau das tun , was Sie wollen - Sie müssen nur das Trennzeichen zwischen Datum und Uhrzeit in ein Leerzeichen und das zwischen Stunden und Minuten und Minuten ändern und Stunden in Doppelpunkte:

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

Angenommen, Sie haben die Zeichenfolgenlänge bereits überprüft, wird dies in das richtige Format konvertiert:

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

Alternativ können Sie die Zeit auch auf Millisekunden reduzieren, indem Sie eine Teilzeichenfolge und Joda Time oder SimpleDateFormat verwenden (ich bevorzuge Joda Time, aber Ihre Laufleistung kann variieren). Nehmen Sie dann den Rest der Zeichenfolge als eine andere Zeichenfolge und analysieren Sie ihn mit Integer.parseInt. Sie können die Werte dann ganz einfach kombinieren:

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

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

Sie könnten Timestamp.valueOf(String) verwenden. In der Dokumentation wird angegeben, dass Zeitstempel im Format yyyy-mm-dd hh:mm:ss[.f...] Verstanden werden. Daher müssen Sie möglicherweise die Feldtrennzeichen in Ihrer eingehenden Zeichenfolge ändern.

Wenn Sie dies tun möchten, können Sie es einfach selbst analysieren und die Methode setNanos verwenden, um die Mikrosekunden zu speichern.

9
Cameron Skinner

So konvertieren Sie einen String in ein Datum:

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

Zugegeben, es hat nur eine Auflösung von Millisekunden, aber in allen Diensten, die langsamer als Twitter sind, ist das alles, was Sie benötigen, zumal die meisten Maschinen nicht einmal die tatsächlichen Nanosekunden aufspüren.

5
Supuhstar

Ich glaube, Sie müssen das tun:

  1. Konvertieren Sie everythingButNano mit SimpleDateFormat oder ähnlichem in everythingDate.
  2. Konvertiere nano mit Long.valueof (nano)
  3. Konvertiere everythingDate in einen Timestamp mit neuem Timestamp (everythingDate.getTime ())
  4. Setze die Timestamp Nanos mit Timestamp.setNano ()

Option 2 Konvertieren Sie in das in Jon Skeets Antwort angegebene Datumsformat und verwenden Sie dieses.

1
DwB

Wenn Sie Zeit als Zeichenfolge in einem Format wie 1441963946053 erhalten, können Sie einfach Folgendes tun:

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