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