Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?
какой самый элегантный способ сделать ISO 8601 форматированное представление текущего момента, UTC? Это должно выглядеть так: 2010-10-12T08:50Z.
21 ответов:
использовать
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());The
SimpleDateFormatэкземпляр может быть объявлен как глобальная константа, если это необходимо часто, но помните, что этот класс не является потокобезопасным. Он должен быть синхронизирован, если к нему одновременно обращаются несколько потоков.EDIT: я бы предпочел время Joda, если делать много разных манипуляций с временем/датой...
EDIT2: исправлена:setTimeZoneне принимает строку (исправлено Павлом)
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX") .withZone(ZoneOffset.UTC) .format(Instant.now());
Pre Java 8:
thisMoment = String.format("%tFT%<tRZ", Calendar.getInstance(TimeZone.getTimeZone("Z")));С документы:
'R'время, отформатированное для 24-часовых часов как "%tH:%tM"'F'ISO 8601 полная дата в формате "%tY - %tm - %td".
Java 8 Native
java.время делает его простым с 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.время, например ThreeTen-Backport, который также имеет порт Android. Оба легче, чем Джода, и учился у Джоды опыт - esp. учитывая, что Java.время разработано автором Джоды.
использовать JodaTime
календарная система ISO 8601 является реализацией по умолчанию в Joda-Time
здесь это документ для Jodatime Formatter
Edit:
Если вы не хотите добавлять или если вы не видите значение добавления выше библиотеки вы можете просто использовать в built
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документы:теперь
public static Instant now()получает текущий момент времени от системных часов.
это будет запрос системные часы UTC для получения текущего момента времени.
toString
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 Времени
обновление: The Joda Времени сейчас режим обслуживания, С командой, консультирующей миграцию в java.время классы. Для Java 6 & 7 см. ThreeTen-Backport проект, дополнительно адаптированный для Android в ThreeTenABP.
С помощью Joda Времени библиотека...
String output = new DateTime( DateTimeZone.UTC ).toString() ;это потокобезопасными. Джода-время создает новое неизменяемые объекты вместо изменения существующих объектов.
если вы действительно намеревались попросить формат без секунд, разрешая до минут, то используйте один из многих других встроенных форматеров в Joda-Time.
DateTime now = new DateTime( DateTimeZone.UTC ) ; String output = ISODateTimeFormat.dateHourMinute.print( now ) ;java.время
для Java 8 и более поздних версий Joda-Time продолжает работать. Но встроенный java.время основы вытесняет Джода-Время. Поэтому перенесите свой код с Joda-Time на java.время, как только это удобно.
посмотреть мой другой ответ для современного решения.
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date,Calendar, &SimpleDateFormat.The Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
вы можете обменять java.время объекты непосредственно с ваша база данных. Используйте - драйвера соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в
java.sql.*классы.где получить java.время занятий?
- 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 bundle реализации java.время занятий.
- для более ранних Android ( ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является полигон для возможных будущих дополнений к Java.время. Вы можете найти некоторые полезные классы, такие как
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);
вы можете использовать Java SimpleDateFormat со следующим рисунком
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(); }вы могли бы использовать:
часовой пояс.getDefault()
для виртуальной машины по умолчанию часовой пояс. Еще здесь
вы можете заметить дату время для нескольких часовых поясов, которые заканчиваются с
'Z'. Эти часовые пояса имеют смещение'0'от GMT.более подробную информацию можно найти здесь.
Я считаю, что самый простой способ-сначала перейти к instant, а затем к строке типа:
String d = new Date().toInstant().toString();что приведет к:
2017-09-08T12:56:45.331Z
вот целый класс оптимизирован так, что вызов "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.930 Z" не основное: "20151209T002242.930Z" ...возможно, нам лучше протестировать список форматов с помощью java SimpleDateFormat.
Я сделал это в Android с помощью календаря и SimpleDateFormat. Следующий метод возвращает календарь с часовым поясом " GMT " (это универсальный часовой пояс). Затем вы можете использовать класс Calendar для установки часа между различными часовыми поясами, используя метод setTimeZone() класса 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 не знает о существовании часовых поясов. По этой причине, если вы отлаживаете одну дату,вы всегда видите дату для вашего текущего часового пояса.
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()); }
tl; dr
некоторые из других ответов верны в рекомендации java.время классы, но идут об использовании ненужных длин для ваших конкретных потребностей.
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::toStringThe
jav.time.Instantкласс представляет момент в UTC, всегда в UTC.Instant instant = Instant.now() ;мгновенный.toString (): 2018-01-23T12: 34: 56.123456 Z
в
Zв конце строки вашего примера2010-10-12T08:50Zпроизносится как "Зулу" и означает UTC.ваш желаемый формат соответствует ISO 8601 стандартные. Элемент java.время классы используют эти стандартные форматы по умолчанию при разборе / генерации строк. Поэтому нет необходимости указывать шаблон форматирования. Просто позвоните
Instant::toStringкак видно выше.если вы специально хотите целые минуты без второго или дробная секунда, затем усечение. Укажите единицу времени через
ChronoUnitкласса.Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ; String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date,Calendar,&SimpleDateFormat.в Joda Времени, теперь режим обслуживания, советует миграция в java.время классы.
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте - драйвера совместимый с JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в
java.sql.*классы.где получить java.время занятий?
- 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 bundle реализации Ява.время занятий.
- для более ранних Android ( ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к Ява.время. Вы можете найти некоторые полезные классы, такие как
Interval,YearWeek,YearQuarterи больше.
Они должны были добавить какой-то простой способ перейти от даты к мгновенному, а также метод под названием
toISO8601, который является то, что многие люди ищут. В дополнение к другим ответам, от java.утиль.Дата в формате ISO 8601:Instant.ofEpochMilli(date.getTime()).toString();это не очень видно при использовании автоматического завершения, но:
java.time.Instant.toString():строковое представление этого момента с использованием ISO-8601
Попробуйте Это,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"); String date=sdf.format (new Date() );его для формата ISO 8601
Comments