Рассмотрим следующий код теста (Try it here yourself on ideone.com - an online Java compiler):Необъяснимая ноль добавляется при переходе от java.util.Date к java.sql.Timestamp
class Main {
public static void main (String[] args) throws Exception {
Main m = new Main();
m.test1();
System.out.println();
m.test2();
}
void test1() throws Exception {
System.out.println("TEST 1: ");
String strTimestamp = "1957-04-27 00:00:00.01";
System.out.println(strTimestamp + " [Original String]");
String format = "yyyy-MM-dd HH:mm:ss.SS";
System.out.println(format + " [Format used]");
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format);
// Convert String to Date:
java.util.Date date = formatter.parse(strTimestamp);
long time = date.getTime();
System.out.println(formatter.format(time) + " [Date#getTime() with same format]");
java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
System.out.println(timestamp + " [Timestamp]");
}
void test2() throws Exception {
System.out.println("TEST 2: ");
String strTimestamp = "1957-04-27 00:00:00.001";
System.out.println(strTimestamp + " [Original String]");
String format = "yyyy-MM-dd HH:mm:ss.SSS";
System.out.println(format + " [Format used]");
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format);
// Convert String to Date:
java.util.Date date = formatter.parse(strTimestamp);
long time = date.getTime();
System.out.println(formatter.format(time) + " [Date#getTime() with same format]");
java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
System.out.println(timestamp + " [Timestamp]");
}
}
Код выше, дает следующий результат:
TEST 1:
1957-04-27 00:00:00.01 [Original String]
yyyy-MM-dd HH:mm:ss.SS [Format used]
1957-04-27 00:00:00.01 [Date#getTime() with same format]
1957-04-27 00:00:00.001 [Timestamp]
TEST 2:
1957-04-27 00:00:00.001 [Original String]
yyyy-MM-dd HH:mm:ss.SSS [Format used]
1957-04-27 00:00:00.001 [Date#getTime() with same format]
1957-04-27 00:00:00.001 [Timestamp]
в TEST 1
я ожидал [Original String]
, [Date#getTime() with same format]
И [Timestamp]
всем иметь один и тот же выход J ust как на TEST 2
.
Почему у [Timestamp]
в TEST 1
есть дополнительный ноль по сравнению с датой?
'S' означает * миллисекунда *, а не дробная секунда. Ничего, кроме 3 из них, не имеет смысла. Всегда используйте 'SSS'. Разбор исходного значения '00: 00: 00.01' не приведет к 1/100'-ю секунды (т.е. 10 мс), но через 1 мс. – Andreas
Связано с: [java.util.Date format SSSSSS: если не микросекунды, то какие последние 3 цифры?] (Http://stackoverflow.com/q/19223171/5221149) – Andreas
@Andreas Спасибо за ответ и ссылку.Как вы правильно указали в комментариях ответа Джонатана, я пытаюсь сохранить эту дату в столбце 'TIMESTAMP (2)' (длина 16) в моей базе данных, поэтому это преобразование важно. В настоящее время он сохраняет его в формате 'yyyyMMddHHmmssSS' в базе данных, поэтому' 1957-04-27 00: 00: 00.001' в 'TEST 1' сохраняется как' 1957042700000000' вместо ожидаемого '1957042700000001'. Возможно, вы знаете, как это исправить? Должен ли я вручную исправлять время в объекте Date каким-то образом после преобразования, когда формат содержит только 1 или 2 капитала 'S'? –