Как получить текущий момент в формате ISO 8601 с датой, часами и минутами? - PullRequest
285 голосов
/ 12 октября 2010

Какой самый элегантный способ получить ISO 8601 отформатированную презентацию текущего момента, UTC?Это должно выглядеть так: 2010-10-12T08:50Z.

Пример:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);

Ответы [ 21 ]

268 голосов
/ 12 октября 2010

Используйте SimpleDateFormat для форматирования любого Date объекта, который вы хотите:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

Использование new Date(), как показано выше, отформатирует текущее время.

215 голосов
/ 12 октября 2010

Для систем, где часовой пояс по умолчанию не является UTC:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

Экземпляр SimpleDateFormat может часто объявляться как глобальная константа, но следует помнить, что этот класс не является потокобезопасным.Он должен быть синхронизирован, если к нему одновременно обращаются несколько потоков.

РЕДАКТИРОВАТЬ: Я бы предпочел Joda Time, если делать много разных манипуляций с временем / датой ...
EDIT2: исправлено: setTimeZone не принимает строку (исправлено Полом)

141 голосов
/ 14 апреля 2015

Java 8 Native

java.time упрощает работу с Java 8. И потокобезопасен.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

Результат: 2015-04-14T11:07:36.639Z

Вы можете испытать желание использовать более легкие Temporal, такие как Instant или LocalDateTime, но им не хватает поддержки форматера или данных часового пояса. Только ZonedDateTime работает из коробки.

Настраивая или связывая опции / операции ZonedDateTime и DateTimeFormatter , вы можете легко управлять часовым поясом и точностью , чтобы определенная степень:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Результат: 2015-04-14T11:07:00+01:00[Europe/Paris]

Уточненные требования, такие как удаление части секунд, должны по-прежнему выполняться в пользовательских форматах или в пользовательском пост-процессе.

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

Для Java 6 и 7 вы можете рассмотреть бэк-порты java.time, такие как ThreeTen-Backport , который также имеет порт Android . Оба легче, чем Джода, и извлекли уроки из опыта Джоды - особенно. учитывая, что java.time разработан автором Йоды.

123 голосов
/ 12 октября 2010

Java 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

Предварительно Java 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

Из документы :

'R' Время, отформатированное для 24-часовых часов как «% tH:% tM»'F' Полная дата ISO 8601 отформатирована как «% tY-% tm-% td».

59 голосов
/ 19 октября 2015

Начиная с Java 8 вы можете просто:

Instant.now().toString();

Из java.time.Instant документов:

сейчас

public static Instant now()

Получает текущий момент от системных часов.

Это запросит системные часы UTC , чтобы получить текущий момент.

ToString

public String toString()

Строковое представление этого момента с использованием представления ISO-8601.

Используемый формат такой же, как DateTimeFormatter.ISO_INSTANT.

25 голосов
/ 12 октября 2010

использование JodaTime

Система календаря ISO 8601 является реализацией по умолчанию в Joda-Time

Здесь - документация для JodaTime Formatter

Edit:

Если вы не хотите добавлять или если вы не видите значения добавления выше библиотеки, вы можете просто использовать встроенный класс SimpleDateFormat для форматирования даты в требуемый формат ISO

как предложено @Joachim Sauer

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
20 голосов
/ 11 января 2013

DateFormatUtils из Apache commons-lang3 имеют полезные константы, например: DateFormatUtils.ISO_DATETIME_FORMAT

18 голосов
/ 10 июля 2012

Если вы не хотите включать Jodatime (как он хорош)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

, который возвращает строку:

2012-07-10T16:02:48.440Z

, который немного отличается от исходного запроса, но все еще соответствует ISO-8601.

16 голосов
/ 09 октября 2013

ISO 8601 может содержать секунды, см. http://en.wikipedia.org/wiki/ISO_8601#Times

, поэтому код должен быть

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
9 голосов
/ 08 апреля 2014

Joda-Time

Обновление: Проект Joda-Time теперь находится в режиме обслуживания , и команда рекомендует перейти на java.time классы. Для Java 6 и 7 см. Проект ThreeTen-Backport , дополнительно адаптированный для Android в проекте ThreeTenABP .

Использование библиотеки Joda-Time

String output = new DateTime( DateTimeZone.UTC ).toString() ;

Это потокобезопасно. Joda-Time создает новые неизменные объекты вместо изменения существующих объектов.

Если вы действительно намеревались запросить формат без секунд, с разрешением в минуты, то используйте один из многих других встроенных форматеров в Joda-Time.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

java.time

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

См. мой другой ответ для современного решения.


О 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 и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...