Обработка MySQL даты и метки времени в Java
в java-приложении какой был бы хороший компромисс с точки зрения извлечения и ввода информации о дате с помощью базы данных MySQL, используя сочетание времени и временных меток?
3 ответа:
на стороне Java дата обычно представлена (плохо спроектирована, но это в сторону)
java.util.Date
. Это в основном поддерживается эпоха времени в аромате along
, также известный как метка времени. Он содержит информацию как о дате, так и о времени частей. В 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...?
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,
- прочитайте его, как это в java.язык SQL.Тип метки времени.
- украсьте значение DateTime как время в часовом поясе UTC с помощью atZone метод в классе LocalDateTime.
затем измените его на нужный часовой пояс. Вот я меняю его на Часовой пояс Торонто.
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"));