SimpleDateFormat не анализирует миллисекунды, а MySql округляет дату

Я использую 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.

Разве Spring не поддерживает современные типы даты и времени java.time? Я бы использовал LocalDateTime, а не Date. Тот класс и SimpleDateFormat давно устарели. С современным API работать намного приятнее.

Ole V.V. 08.04.2018 07:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
1 558
5

Ответы 5

Если вы используете 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

David Portabella 22.08.2019 08:15

В то время как MySQL может обрабатывать микросекунды, исходный API даты / времени Java (который использовал OP) обрабатывает только миллисекундное разрешение. API даты / времени, представленный в Java 8, достигает наносекундного разрешения (хотя практически говоря, для таких вещей, как текущее время, которое исходит от системных часов, вы, вероятно, в любом случае получите только миллисекундное разрешение).

kshetline 22.08.2019 12:42

Шаблон для месяца года должен быть 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;

Другие вопросы по теме