Преобразовать строку Java в sql.Timestamp - PullRequest
32 голосов
/ 02 октября 2011

Получена строка в следующем формате: ГГГГ-ММ-ДД-ЧЧ.ММ.СС.NNNNNN Отметка времени поступает из базы данных DB2.Мне нужно разобрать его в java.sql.Timestamp и НЕ потерять прецедент.До сих пор я не смог найти существующий код, который можно было бы анализировать до микросекунд.SimpleDateFormat возвращает Date и анализирует только миллисекунды.Кратко посмотрел на JodaTime и не увидел, что это сработает.

Ответы [ 5 ]

67 голосов
/ 02 октября 2011

Вы пробовали использовать 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);
}

Кроме того, можно проанализировать до миллисекунд, взяв подстроку и используя 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);
7 голосов
/ 02 октября 2011

Вы можете использовать Timestamp.valueOf(String).В документации говорится, что она понимает метки времени в формате yyyy-mm-dd hh:mm:ss[.f...], поэтому вам может потребоваться изменить разделители полей во входящей строке.

Опять же, если вы собираетесь это сделать, то вы можете просто разобратьСделайте это самостоятельно и используйте метод setNanos для хранения микросекунд.

4 голосов
/ 28 ноября 2013

Вот предполагаемый способ сделать это:

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, это все, что вам нужно, тем более что большинство компьютеров этого не делают.даже отследить до фактических наносекунд.

2 голосов
/ 11 сентября 2015

Если вы получаете время в виде строки в таком формате, как 1441963946053, вы просто можете сделать что-то следующее:

//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);
1 голос
/ 02 октября 2011

Полагаю, вам нужно сделать следующее:

  1. Конвертировать всеButNano с помощью SimpleDateFormat или аналогичного ему в everythingDate.
  2. Конвертировать nano с помощью Long.valueof (nano)
  3. Конвертировать все Дата в метку времени с новой меткой времени (everythingDate.getTime ())
  4. Установить нанометры меток времени с помощью Timestamp.setNano ()

Вариант 2 Преобразовать в указанный формат датыв ответе Джона Скита и используйте это.

...