Обработка MySQL даты и метки времени в Java


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

3   51  

3 ответа:

на стороне Java дата обычно представлена (плохо спроектирована, но это в сторону)java.util.Date. Это в основном поддерживается эпоха времени в аромате a 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.

MySQL документация имеет информацию о сопоставлении типов MySQL с типами Java. В общем, для MySQL datetime и timestamps вы должны использовать 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:

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

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

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

при записи значения datetime в 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.Тип метки времени.
  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"));