web-dev-qa-db-ja.com

Java Stringをsql.Timestampに変換

次の形式の文字列を受け取りました:YYYY-MM-DD-HH.MM.SS.NNNNNNタイムスタンプはDB2データベースから取得されます。 Java.sql.Timestampに解析する必要があり、精度を失うことはありません。これまでのところ、マイクロ秒まで解析できる既存のコードを見つけることができませんでした。 SimpleDateFormatはDateを返し、ミリ秒までしか解析しません。 JodaTimeを簡単に見てみると、それがうまくいくとは思わなかった。

33
Dan

Timestamp.valueOf(String) を使用してみましたか?必要なように見えるalmostまさにあなたが望むもの-日付と時刻の間の区切り文字をスペースに変更するだけで、時間と分、分と時間、コロン:

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);
72
Jon Skeet

Timestamp.valueOf(String)を使用できます。ドキュメントには、yyyy-mm-dd hh:mm:ss[.f...]形式のタイムスタンプが理解されるため、受信文字列のフィールド区切り文字を変更する必要がある場合があると記載されています。

繰り返しますが、それを行う場合は、自分で解析してsetNanosメソッドを使用してマイクロ秒を保存することができます。

9
Cameron Skinner

文字列を日付に変換する方法は次のとおりです。

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よりも遅いすべてのサービスで必要なのはそれだけです。

5
Supuhstar

私はあなたがこれをする必要があると信じています:

  1. SimpleDateFormatなどを使用してeverythingButNanoをeverythingDateに変換します。
  2. Long.valueof(nano)を使用してnanoを変換します
  3. 新しいTimestamp(everythingDate.getTime())でeverythingDateをTimestampに変換します
  4. Timestamp.setNano()でTimestamp nanoを設定します

オプション2 Jon Skeetの回答で指摘されている日付形式に変換して使用します。

1
DwB

1441963946053などの形式の文字列として時間を取得する場合は、次のようにするだけです。

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