Обработка даты и времени MySQL в Java - PullRequest
56 голосов
/ 24 июля 2010

В java-приложении, что было бы хорошим компромиссом в плане извлечения и ввода информации о дате с базой данных MySQL, используя сочетание даты и времени?

Ответы [ 3 ]

104 голосов
/ 24 июля 2010

На стороне Java дата обычно представлена ​​(плохо разработанной, но в стороне) java.util.Date. Это в основном поддерживается Epoch time в аромате long, также известном как отметка времени. Он содержит информацию о дате и времени. В Java точность указывается в миллисекундах.

На стороне SQL существует несколько стандартных типов даты и времени, DATE, TIME и TIMESTAMP (в некоторых БД, также называемых DATETIME), которые представлены в JDBC как java.sql.Date , java.sql.Time и java.sql.Timestamp, все подклассы из java.util.Date. Точность зависит от БД, часто в миллисекундах, как Java, но также может быть в секундах.

В отличие от java.util.Date, java.sql.Date содержит только информацию о части даты (год, месяц, день). Time содержит только информацию о временной части (часы, минуты, секунды), а Timestamp содержит информацию об обеих частях, как java.util.Date.

Обычной практикой для хранения временной метки в БД (например, java.util.Date на стороне Java и java.sql.Timestamp на стороне JDBC) является использование PreparedStatement#setTimestamp().

java.util.Date date = getItSomehow();
Timestamp timestamp = new Timestamp(date.getTime());
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?");
preparedStatement.setTimestamp(1, timestamp);

Обычной практикой для получения метки времени из БД является использование ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
8 голосов
/ 24 июля 2010

Документация MySQL содержит информацию о сопоставлении типов MySQL с типами Java. В общем, для даты и времени MySQL вы должны использовать java.sql.Timestamp. Несколько ресурсов включают в себя:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

Как сохранить дату Java в Mysql datetime ...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

EDIT:

Как указали другие, предложение об использовании строк может привести к проблемам.

4 голосов
/ 24 апреля 2018

BalusC дал хорошее описание проблемы, но в ней отсутствует хороший сквозной код, который пользователи могут сами выбрать и протестировать.

Рекомендуется всегда хранить дату и время в часовом поясе UTC в БД. Тип временной отметки Sql не имеет информации о часовом поясе.

При записи значения даты и времени в sql db

    //Convert the time into UTC and build Timestamp object.
    Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
    //use setTimestamp on preparedstatement
    preparedStatement.setTimestamp(1, ts);

При чтении значения обратно из БД в Java,

  1. Прочитайте это как в типе java.sql.Timestamp.
  2. Укажите значение DateTime как время в часовом поясе UTC, используя atZone. метод в классе LocalDateTime.
  3. Затем измените его на желаемый часовой пояс. Здесь я меняю его на Часовой пояс Торонто.

    ResultSet resultSet = preparedStatement.executeQuery();
    resultSet.next();
    Timestamp timestamp = resultSet.getTimestamp(1);
    ZonedDateTime timeInUTC = timestamp.toLocalDateTime().atZone(ZoneId.of("UTC"));
    LocalDateTime timeInToronto = LocalDateTime.ofInstant(timeInUTC.toInstant(), ZoneId.of("America/Toronto"));
    
...