Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?
Какой самый элегантный способ получить ISO 8601 отформатированное представление текущего момента, UTC? Он должен выглядеть так: 2010-10-12T08:50Z
.
- Android - запуск службы при загрузке
- Приложение распознавания речи Android без всплывающих окон
- Получение параметров хеширования из запроса URL
- Как программно удалить файлы на Android?
- Вибрация с длительностью и узором
- Как отобразить два столбца ListView в Android?
- Значение оператора import в файле Java
- Преобразование java.util.Properties в HashMap
Используйте 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()
как показано выше, отформатирует текущее время.
Для систем, где часовой пояс по умолчанию не 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
может быть объявлен как глобальная константа при необходимости часто, но будьте осторожны, чтобы этот class не был streamобезопасным. Он должен быть синхронизирован при одновременном доступе несколькими streamами.
EDIT: Я бы предпочел Joda Time, если вы делаете много разных манипуляций Times / Date …
EDIT2: исправлено: setTimeZone
не принимает строку (исправлено Paul)
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX") .withZone(ZoneOffset.UTC) .format(Instant.now());
Предварительная Java 8:
thisMoment = String.format("%tFT%
Из документов :
'R'
Время отформатировано для 24-часового такта как «% tH:% tM»
'F'
ISO 8601 полная дата, отформатированная как "% tY-% tm-% td".
Java 8 Родной
java.time делает его простым с Java 8. И streamобезопасным.
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 разработан автором Joda.
использовать JodaTime
Календарная система ISO 8601 является стандартной реализацией в рамках Joda-Time
Вот документ для JodaTime Formatter
Редактировать:
Если вы не хотите добавлять или не видите значение добавления выше библиотеки, вы можете просто использовать встроенный class SimpleDateFormat
для форматирования даты в требуемом формате ISO
как предложил @Joachim Sauer
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ"); String nowAsString = df.format(new Date());
Начиная с Java 8 вы можете просто:
Instant.now().toString();
Из java.time.Instant
docs:
Теперь
public static Instant now()
Получает текущий момент из системных часов.
Это запросит часы UTC системы, чтобы получить текущий момент.
нанизывать
public String toString()
Строковое представление этого момента с использованием представления ISO-8601.
Используемый формат такой же, как
DateTimeFormatter.ISO_INSTANT
.
DateFormatUtils из Apache commons-lang3
имеют полезные константы, например: DateFormatUtils.ISO_DATETIME_FORMAT
Если вы не хотите включать Jodatime (так приятно, как есть)
javax.xml.bind.DatatypeConverter.printDateTime( Calendar.getInstance(TimeZone.getTimeZone("UTC")) );
который возвращает строку:
2012-07-10T16:02:48.440Z
который немного отличается от первоначального запроса, но по-прежнему является ISO-8601.
ISO 8601 может содержать секунды, см. http://en.wikipedia.org/wiki/ISO_8601#Times
поэтому код должен быть
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Joda времени
Обновление: проект Joda-Time теперь находится в режиме обслуживания , а команда советует перейти на classы 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 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить classы java.time?
- Java SE 8 , Java SE 9 , Java SE 10 и более поздние версии
- Встроенный.
- Часть стандартного Java API с интегрированной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport .
- Android
- Более поздние версии реализаций пакетов Android classов java.time.
- Для более ранних Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP ….
Проект ThreeTen-Extra расширяет java.time с дополнительными classами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные classы, такие как Interval
, YearWeek
, YearQuarter
и другие .
Для Java версии 7
Вы можете ознакомиться с документацией Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html.
X – используется для часового пояса ISO 8601
TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); df.setTimeZone(tz); String nowAsISO = df.format(new Date()); System.out.println(nowAsISO); DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); //nowAsISO = "2013-05-31T00:00:00Z"; Date finalResult = df1.parse(nowAsISO); System.out.println(finalResult);
Вы можете использовать SimpleDateFormat Java со следующим шаблоном yyyy-MM-dd'T'HH:mm:ssXXX
для ISO 8601.
Пример кода: (перечислены все доступные часовые пояса)
for (String timeZone : TimeZone.getAvailableIDs()) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone)); String formatted = dateFormat.format(new Date()); System.out.print(formatted); if (formatted.endsWith("Z")) { // These time zone's have offset of '0' from GMT. System.out.print("\t(" + timeZone + ")"); } System.out.println(); }
Вы можете использовать:
TimeZone.getDefault ()
для часовой пояс vm по умолчанию. Подробнее здесь
Вы можете заметить время даты для нескольких часовых поясов, которые заканчиваются на 'Z'
. Эти часовые пояса имеют смещение '0'
от GMT.
Более подробную информацию можно найти здесь .
Я считаю, что самый простой способ – сначала перейти к мгновенному, а затем добавить строку:
String d = new Date().toInstant().toString();
Это приведет к:
2017-09-08T12:56:45.331Z
Вот целый class, оптимизированный так, что вызов «now ()» не делает ничего более того, что он должен делать.
public class Iso8601Util { private static TimeZone tz = TimeZone.getTimeZone("UTC"); private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); static { df.setTimeZone(tz); } public static String now() { return df.format(new Date()); } }
Тем не менее, joda-time поддерживает только расширенный формат: «2015-12-09T00: 22: 42.930Z» не является базовым: «20151209T002242.930Z» … нам может быть лучше тестировать список форматов с помощью java SimpleDateFormat.
Я сделал это в Android с помощью Calendar и SimpleDateFormat. Следующий метод возвращает календарь с часовым поясом «GMT» (это универсальный часовой пояс). Затем вы можете использовать class Calendar для установки часа между часовыми поясами разных времен, используя метод setTimeZone () classа Calendar.
private static final String GMT = "GMT"; private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss"; public static Calendar isoToCalendar(final String inputDate) { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT)); try { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone(GMT)); Date date = dateFormat.parse(inputDate); calendar.setTime(date); } catch (ParseException e) { Log.e("TAG",e.getMessage()); } return calendar; }
ПОМНИТЕ: Класс Date не знает о существовании TimeZone. По этой причине, если вы отлаживаете одну дату, вы всегда видите дату для своего текущего часового пояса.
private static String getCurrentDateIso() { // Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat.format(new Date()); }
Они должны были добавить какой-то простой способ перейти от Date to Instant, а также метод, называемый toISO8601
, и это то, что многие ищут. В дополнение к другим ответам, от формата java.util.Date до ISO 8601:
Instant.ofEpochMilli(date.getTime()).toString();
Это не так заметно при использовании автозаполнения, но: java.time.Instant.toString()
:
Строковое представление этого момента с использованием ISO-8601
DateTimeFormatter.ISO_DATE_TIME .withZone(ZoneOffset.UTC) .format(yourDateObject.toInstant())
ТЛ; др
Некоторые из других ответов правильны, рекомендуя classы java.time, но используйте ненужные длины для ваших конкретных потребностей.
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds. .truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes. .toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12: 34Z
Instant::toString
Класс jav.time.Instant
представляет собой момент в UTC, всегда в UTC.
Instant instant = Instant.now() ;
instant.toString (): 2018-01-23T12: 34: 56.123456Z
Z
в конце строки вашего примера 2010-10-12T08:50Z
произносится как «Zulu» и означает UTC .
Желаемый формат соответствует стандарту ISO 8601 . Классы java.time используют эти стандартные форматы по умолчанию при parsingе / генерации строк. Поэтому нет необходимости указывать шаблон форматирования. Просто вызовите Instant::toString
как показано выше.
Если вы специально хотите целые минуты без второй или дробной секунды, то обрезайте. Укажите единицу времени с помощью classа ChronoUnit
.
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ; String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
О java.time
Рамка java.time встроена в Java 8 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить classы java.time?
- Java SE 8 , Java SE 9 , Java SE 10 и более поздние версии
- Встроенный.
- Часть стандартного Java API с интегрированной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport .
- Android
- Более поздние версии реализаций пакетов Android classов java.time.
- Для более ранних Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP ….
Проект ThreeTen-Extra расширяет java.time с дополнительными classами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные classы, такие как Interval
, YearWeek
, YearQuarter
и другие .
Попробуй это,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"); String date=sdf.format (new Date() );
Его формат ISO 8601