У меня есть строка с датой, и я хочу разобрать ее на обычную дату, используя java Date API, следующий код:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Однако я получил исключение: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Так что мне интересно, придется ли мне разбивать строку и анализировать ее вручную?
Кстати, я попытался добавить символ одинарной кавычки по обе стороны от T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Это тоже не работает.
java
date
simpledateformat
iso8601
hguser
источник
источник
T
Означает время и является частью ISO8601 стандарта для международного времени форматирования даты.T
в одинарные кавычки работала для меня (по крайней мере, с точки зрения решения ошибки разбора).Ответы:
Обновление для Java 8 и выше
Теперь вы можете просто сделать
Instant.parse("2015-04-28T14:23:38.521Z")
и получить правильную вещь сейчас, тем более, что вам следует использоватьInstant
взломанныеjava.util.Date
последние версии Java.Вы должны использовать
DateTimeFormatter
вместо того, чтобыSimpleDateFormatter
.Оригинальный ответ:
Это работает с вводом с трейлингом,
Z
как показано:Q2597083.java
Производит следующий вывод:
источник
ТЛ; др
Используйте
java.time.Instant
класс для разбора текста в стандартном формате ISO 8601, представляющего момент в UTC.ISO 8601
Этот формат определяется стандартом ISO 8601 для строковых форматов даты и времени.
Обе:
… Использовать форматы ISO 8601 по умолчанию для анализа и генерации строк.
Как правило, вам следует избегать использования старых классов java.util.Date /.Calendar & java.text.SimpleDateFormat, поскольку они заведомо хлопотны, сбивают с толку и имеют недостатки. Если требуется для взаимодействия, вы можете конвертировать туда и сюда.
java.time
В Java 8 и более поздние версии встроен новый фреймворк java.time . Вдохновленный Joda-Time , определенным JSR 310 и расширенным проектом ThreeTen-Extra .
Преобразовать в старый класс.
Часовой пояс
При необходимости вы можете назначить часовой пояс.
Перерабатывать.
Joda времени
ОБНОВЛЕНИЕ: проект Joda-Time сейчас находится в режиме обслуживания. Команда советует перейти на классы java.time .
Вот пример кода в Joda-Time 2.8.
Преобразовать в старый класс. Обратите внимание, что назначенный часовой пояс теряется при конвертации, поскольку juDate нельзя назначить часовой пояс.
Часовой пояс
При необходимости вы можете назначить часовой пояс.
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, и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
, и более .источник
На данный момент есть два вышеупомянутых ответа, и оба они длинные (и tl; dr слишком короткое ИМХО), поэтому я пишу сводку по своему опыту, начав использовать новую библиотеку java.time (применимо, как отмечено в других ответах к версии Java). 8+). ISO 8601 устанавливает стандартный способ записи даты:
YYYY-MM-DD
формат даты и времени только такой, как показано ниже (может быть 0, 3, 6 или 9 цифр в миллисекундах), и строка форматирования не требуется:Мне это не нужно, но поскольку получение года в коде из вопроса, то:
это сложнее, не может быть сделано
Instant
напрямую, может быть выполнено с помощьюCalendar
вопросов. Получить целое значение текущего года в Java и преобразовать Java. время для календаря, но IMHO, поскольку формат является фиксированной подстрокой, более простой в использовании:источник