Obsługa dat i znaczników czasu MySQL w Javie

W aplikacji java jaki byłby dobry kompromis w zakresie wydobywania i wprowadzania informacji o datach z bazy danych MySQL przy użyciu kombinacji dat i znaczników czasu?

Author: BalusC, 2010-07-24

3 answers

Po stronie Javy, Data jest zwykle reprezentowana przez (źle zaprojektowane, ale że poza) java.util.Date. Jest w zasadzie wspierany przez Czas epoki w smaku long, znany również jako znacznik czasu. Zawiera informacje zarówno o części daty, jak i czasu. W języku Java precyzja wynosi milisekundy.

Po stronie SQL istnieje kilka standardowych typów daty i czasu, DATE, TIME i TIMESTAMP (w niektórych DB ' S zwanych również DATETIME), które są reprezentowane w JDBC jako java.sql.Date, java.sql.Time oraz java.sql.Timestamp, wszystkie podklasy Z java.util.Date. Precyzja jest zależna od DB, często w milisekundach, jak Java, ale może być również w sekundach.

W przeciwieństwie do java.util.Date, java.sql.Date zawiera tylko informacje o części daty (Rok, Miesiąc, Dzień). Time zawiera tylko informacje o części czasu (godziny, minuty, sekundy), a Timestamp zawiera informacje o obu częściach, tak jak robi to java.util.Date.

Normalna praktyka aby zapisać znacznik czasu w DB (tak więc {[2] } Po stronie Javy i {[10] } po stronie JDBC) należy użyć 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);

Normalną praktyką uzyskiwania znacznika czasu z DB jest użycie ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
 97
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 04:53:29

Dokumentacja MySQL zawiera informacje o mapowaniu typów MySQL na typy Java. Ogólnie rzecz biorąc, dla datetime MySQL i znaczników czasu należy użyć java.sql.Timestamp. Niektóre zasoby obejmują:

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

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

Jak zapisać datę Javy do Mysql datetime...?

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

EDIT:

Jak wskazywali inni, sugestia użycia ciągów może prowadzić do problemów.

 8
Author: Garett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:44

BalusC podał dobry opis problemu, ale brakuje w nim dobrego kodu end to end, który użytkownicy mogą wybrać i przetestować dla siebie.

Najlepszą praktyką jest zawsze zapisywanie daty i czasu w strefie czasowej UTC w DB. Typ znacznika czasu Sql nie zawiera informacji o strefie czasowej.

Podczas zapisu wartości datetime do 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);

Podczas odczytu wartości z DB do Javy,

  1. przeczytaj to tak, jak jest w Javie.sql.Typ znacznika czasu.
  2. Udekoruj wartość DateTime jako czas w strefie czasowej UTC przy użyciu atZone metoda w klasie LocalDateTime.
  3. Następnie zmień go na żądaną strefę czasową. Tutaj zmieniam go na Strefa czasowa Toronto.

    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"));
    
 3
Author: Dorjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 14:56:28