Избегайте старых классов даты и времени
Вы используете старые классы java.util.Date/.Calendar и SimpleDateFormat. Избегайте их.
Класс Date имеет плохой выбор дизайна: toString
, применяющий часовой пояс по умолчанию при генерации строки. Так что кажется, что у него есть часовой пояс, а на самом деле его нет (за исключением одного, скрытого внизу, который игнорируется для регулярного использования). Смущает, да. Избегайте этого.
java.time
Вместо этого используйте java.time, встроенный в Java 8 и более поздние версии.
Первый разбор как LocalDateTime
без часового пояса или смещения.
LocalDateTime ldt = LocalDateTime.parse( "1995-12-31T23:59:59Z" );
Примените часовой пояс или смещение от UTC , чтобы придать этому значению LocalDateTime
, чтобы сделать его фактическим моментом на временной шкале. Вы должны знать или спросить, какой часовой пояс или смещение был задан этой строкой, так как никаких указаний не было. Для этого примера я буду произвольно предполагать Квебек .
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
Ваш желаемый выход имеет Z
на конце, для Zulu
, что означает UTC .
В java.time Instant
представляет момент времени на UTC. Вы можете извлечь Instant
из ZonedDateTime
.
Instant instant = zdt.toInstant();
Метод Instant
class ’toString
создает строку в нужном формате. Этот формат является одним из стандартных ISO 8601 форматов.
String output = instant.toString();
Half-Open
Я заметил, что ваш пример значения пытался получить в конце 1995 года. Есть лучший способ выполнить такой поиск или критерии сравнения.
В работе с датой и временем лучшая практика называется Half-Open, где начало промежутка времени составляет включительно , а окончание - эксклюзивно . Таким образом, неделя начинается в понедельник и продолжается, но не включая следующий понедельник.
Определение года означает начало с первого момента первого дня 1995 года и вплоть до, но не включая, первый момент первого дня следующего за года, 1996 года. Поиск любых значений в пределах этот диапазон делается не между, а как: ( someEvent >= firstMomentOf1995 AND someEvent < firstMomentOf1996 )
(не <=). </p>