MySql datetime хранится не в формате UTC, а в часовом поясе сервера.

Вам нужно использовать группу (int) вашей группы-сома (0) - это полное совпадение, а группа (1) - первая группа, которую вы отметили. В указанном вами примере группа (1) - это то, что приходит после «предложения».

0
задан Sunnyday 15 January 2019 в 19:43
поделиться

1 ответ

tl; dr

Используйте современные java.time классы, никогда java.util.Date или java.sql.Date или java.sql.Timestamp.

myPreparedStatement                   // With JDBC 4.2, wa can directly exchange java.time objects with the database.
.setObject(                           // Pass a `OffsetDateTime` object representing the moment we want stored in the database.
    LocalDateTime.parse(              // Parse the input string lacking an indicator of offset or zone.
        "2019-01-19T19:00"            // When using strings in standard ISO 8601 format, no need to specify a formatting pattern.
    )                                 // Returns a `LocalDateTime`, an ambiguous value without real meaning.
    .atZone(                          // Apply a time zone to give meaning to the `LocalDateTime`. 
        ZoneId.of( "Europe/Paris" )   // Here we are saying "the 7 PM on that date as seen on the clock on the wall of someone standing in Paris France".
    )                                 // Returns a `ZonedDateTime` object.
    .toOffsetDateTime()               // Returns an `OffsetDateTime` object as demanded by the JDBC spec, stripping off the time zone to leave on the hours-minutes-seconds from UTC.
)

java.time

Вы используете ужасные классы даты и времени, которые были вытеснены годами назад классами java.time . На самом деле нет смысла пытаться отлаживать / понимать унаследованные классы, так как они чертовски ужасны.

LocalDateTime

Разобрать вашу входную строку как LocalDateTime, так как в ней отсутствует индикатор часового пояса или смещения от UTC .

По возможности используйте стандартные форматы ISO 8601 для текста даты и времени. Для даты с временем суток будет YYYY-MM-DDTHH: MM: SS, где T отделяет часть даты от части времени.

String input = "2019-01-19T19:00" ;
LocalDateTime ldt = LocalDateTime.parse( input ) ; // No need to specify formatting pattern when using standard ISO 8601 formats.

ZonedDateTime

В классе LocalDateTime также отсутствует понятие зоны или смещения. Таким образом, объект этого класса не представляет момент, не является не точкой на временной шкале. Он представляет потенциальных моментов в диапазоне около 26-27 часов в различных часовых поясах по всему миру.

Похоже, вы наверняка знаете, что эта дата и время должны были представлять момент в определенном часовом поясе. Поэтому примените часовой пояс, чтобы придать смысл нашему неоднозначному LocalDateTime объекту.

Укажите собственное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 2-4-буквенное сокращение, такое как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Europe/Paris" ) ;  

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы не знаем наверняка, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали об этой проблеме.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Теперь мы можем применить ZoneId, чтобы получить ZonedDateTime.

ZonedDateTime zdt = ldt.atZone( z ) ;

OffsetDateTime

Ваш JDBC может принимать объект ZonedDateTime, но спецификация JDBC 4.2 требует, чтобы он принимал OffsetDateTime. Какая разница? И ZonedDateTime, и OffsetDateTime представляют момент, точку на временной шкале. Смещение всего на несколько часов-минут-секунд вперед или назад по UTC. Часовой пояс гораздо больше. Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона. Так что часовой пояс всегда предпочтительнее. За исключением случаев, когда мы используем JDBC для обмена объектом java.time с базой данных, мы используем OffsetDateTime для написания стандартного кода.

OffsetDateTime odt = zdt.toOffsetDateTime() ;  // Convert from moment with time zone to a moment with merely an offset-from-UTC.

Теперь мы можем передать этот момент вашему подготовленному заявлению.

myPreparedStatement( … , odt ) ;  // Pass a `OffsetDateTime` moment as the value for a placeholder in the SQL of your prepared statement.

Извлечение.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Назначьте нужный часовой пояс.

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZone( z ) ;

И odt, и zdt, показанные в нескольких приведенных выше строках, представляют один и тот же момент одновременности, одну и ту же точку на временной шкале. Отличается только их время на настенных часах, так как большинство баз данных хранят и извлекают UTC, пока вы хотите видеть время по Парижу.


О java.time

Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как java.util.Date , Calendar и amp; SimpleDateFormat .

Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .

Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval , YearWeek , YearQuarter и еще . [11124 ]

0
ответ дан Basil Bourque 15 January 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: