Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?



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

1242   21  

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::toString

The 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

DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

Попробуйте Это,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

его для формата ISO 8601

Comments

    Ничего не найдено.