В ответ на свой неправильный ответ …
23:00 UTC = 00:00 + 01:00 следующего дня (в тот же момент)
Ср 24 декабря 1999 00:00:00 GMT + 0100 (Mitteleuropäische Normalzeit)
но в запросе это
1999-12-23T23: 00: 00.000Z
Эти две строки представляют одно и то же значение. Это два способа просмотра одного и того же момента. Один в 23:00 по UTC, другой на час впереди UTC, поэтому он представляет собой первый момент следующего дня. Добавление одного часа к 23:00 23-го числа в течение 24-часового дня завершает удар полуночи до первого момента 24-го.
Синтаксический
Разобрать вашу входную строку как Instant
. Z на конце означает UTC и произносится как «зулу». Instant
представляет момент в UTC, всегда UTC, по определению.
Ваша входная строка в стандартном формате ISO 8601. Классы java.time по умолчанию используют эти стандартные форматы при разборе / генерации строк. Поэтому нет необходимости указывать шаблон форматирования.
Instant instant = Instant.parse( "1999-12-23T23:00:00.000Z" ) ;
Момент (дата, время суток и назначенный часовой пояс или смещение от UTC) должны быть сохранены в столбце базы данных типа, подобного стандартному типу SQL TIMESTAMP WITH TIME ZONE
. Столбец типа сродни TIMESTAMP WITHOUT TIME ZONE
будет иметь тип данных неправильный .
Для записи в вашу базу данных нам нужно переключиться с базового класса строительных блоков Instant
на более гибкий OffsetDateTime
класс. Поддержка класса OffsetDateTime
в драйверах JDBC требуется для JDBC 4.2 и более поздних версий, тогда как поддержка Instant
является необязательной.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Запись в базу данных через PreparedStatement
с заполнителем ?
.
myPreparedStatement.setObject( … , odt ) ;
индексирование.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Об этом много раз говорилось о переполнении стека. Так что ищите, чтобы узнать больше. И, прежде чем публиковать, внимательно изучите переполнение стека.
LocalDate
Если ваша цель состоит в том, чтобы отслеживать только дату, и вы не заботитесь о времени суток и часовом поясе, вы должны использовать LocalDate
в Java и столбец DATE
в стандартном SQL.