Как конвертировать Java-дату без Z в дату с Z - PullRequest
2 голосов
/ 21 июня 2011

У меня есть следующее значение даты 1995-12-31T23: 59: 59

, но чтобы разобрать его для запроса solr, он мне нужен в следующем формате

1995-12-31T23: 59: 59Z

Как я могу разобрать это, чтобы получить добавленный "Z" в конце в Java 1.6?

Тип должен быть java.util.date после преобразования - fyi

Когда я сейчас запускаю дату и пытаюсь проанализировать ее с объектом SimpleDateFormat, она выглядит следующим образом

"Пн Ян 01 00:00:00 CST 2001" - что это за формат для конвертации?

Ответы [ 3 ]

5 голосов
/ 21 июня 2011

Использовать SimpleDateFormat:

  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  Date d = df.parse("1995-12-31T23:59:59Z");
  System.out.println(d);

Поставьте 'Z' в одинарных кавычках, чтобы экранировать

0 голосов
/ 18 февраля 2016

Избегайте старых классов даты и времени

Вы используете старые классы 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>

0 голосов
/ 21 июня 2011

«Z» - это сокращение часового пояса для часового пояса Зулу, то есть UTC. Если solr API принимает объект даты, вы можете просто проанализировать дату следующим образом, установив предпочтительный часовой пояс:

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateParser.setTimeZone(TimeZone.getTimeZone("Z"));
Date date = df.parse("1995-12-31T23:59:59");

Если вам нужно преобразовать его обратно в строку, используйте метод, предоставленный nsfyn55:

SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
System.out.println(dateFormatter.format()); 
...