Подтвердить что ты не робот

Преобразование строки Java в sql.Timestamp

Получена строка, входящая в этот формат: YYYY-MM-DD-HH.MM.SS.NNNNNN Временная метка исходит из базы данных DB2. Мне нужно разобрать его в java.sql.Timestamp и НЕ потерять любую точность. До сих пор мне не удалось найти существующий код для синтаксического анализа этого момента до микросекунд. SimpleDateFormat возвращает дату и обрабатывает только миллисекунды. Посмотрел на JodaTime кратко и не видел, что это сработает.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Вот предполагаемый способ преобразования строки в дату:

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

По общему признанию, он имеет разрешение только в миллисекундах, но во всех сервисах медленнее, чем в Твиттере, все, что вам нужно, тем более что большинство машин даже не отслеживают фактические наносекунды.

Ответ 4

Я считаю, что вам нужно сделать это:

  • Преобразование allButNano с помощью SimpleDateFormat или тому подобного для всегоDate.
  • Преобразование nano с использованием Long.valueof(nano)
  • Преобразовать allDate в метку времени с новой отметкой времени (everythingDate.getTime())
  • Установите наброски Timestamp с Timestamp.setNano()

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

Ответ 5

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

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