Я использую SimpleDateFormat для синтаксического анализа строки до даты. После разбора загружаю эту дату в mysql. Проблема в том, что миллисекунды не анализируются на Date, и когда я вставляю объект в Mysql, он округляется.
myStringDate = "2018-02-02 23:59:59.700"
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSS");
myObject.setDate(fmt.parse(myStringDate );
Когда я отлаживаю код, я вижу дату как Sun 02 февраля 23:59:59 BRST 2018 (миллисекунды не сохраняются)
Данные хранятся в mysql как '2017-02-03 00:00:00'
Моя модель отображается как:
import javax.persistence.*;
import java.util.Date;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "date")
private Date date;
И столбец на MySqls - это TYPE DATETIME.




Если вы используете MySQL версии 5.6.4, вы можете увидеть это, объявив столбцы с типами данных с дробной второй раз.
Документация Этот показывает более подробную информацию об этой функции, и что касается быстрой проверки - вы можете попробовать SELECT NOW(3), который должен предоставить вам текущее время из операционной системы вашего сервера MySQL с точностью до миллисекунды, и вместо этого, если вы получаете сообщение об ошибке, вы не использую правильную версию.
Наряду с этим настоятельно рекомендуется переход от старого драйвера Connector / J к mysql-connector-java-5.1.26.jar.
Надеюсь, это поможет ответить на ваш вопрос!
Я думаю, что миллисекунды на самом деле анализируются, вы просто не видите их с форматированием по умолчанию, которое вы получаете, когда отображаете дату для целей отладки.
Используя этот код:
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String myStringDate = "2018-02-02 23:59:59.700";
Date date = fmt.parse(myStringDate);
System.out.println(date);
System.out.println(fmt.format(date));
Я получаю такой вывод:
Fri Feb 02 23:59:59 EST 2018
2018-02-02 23:59:59.700
Обновление: убедитесь, что для месяца вы используете заглавную букву MM, а не mm.
Обратите внимание, что дробная часть - это микросекунды (а не миллисекунды). "Значение DATETIME или TIMESTAMP может включать конечную дробную часть секунд с точностью до микросекунд (6 цифр) ... диапазон значений DATETIME от '1000-01-01 00: 00: 00.000000' до '9999-12-31 23: 59: 59.999999 '"dev.mysql.com/doc/refman/8.0/en/datetime.html
В то время как MySQL может обрабатывать микросекунды, исходный API даты / времени Java (который использовал OP) обрабатывает только миллисекундное разрешение. API даты / времени, представленный в Java 8, достигает наносекундного разрешения (хотя практически говоря, для таких вещей, как текущее время, которое исходит от системных часов, вы, вероятно, в любом случае получите только миллисекундное разрешение).
Шаблон для месяца года должен быть MM (верхний регистр), а не mm (нижний регистр) для SimpleDateFormat. Возможно, ваш код читает месяц как значение минут.
Формат даты в SQL - YY-MM-dd hh24: mi: ss: mmm, а в Java - YY-MM-dd HH: mm: ss.SSS.
Я использовал LocalDateTime:
@Column (name = "date", columnDefinition = "DATETIME (3)") частная дата LocalDateTime;
Разве Spring не поддерживает современные типы даты и времени
java.time? Я бы использовалLocalDateTime, а неDate. Тот класс иSimpleDateFormatдавно устарели. С современным API работать намного приятнее.