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

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

Пример:

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

Ответы [ 21 ]

7 голосов
/ 08 апреля 2014

Для 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);
5 голосов
/ 08 сентября 2017

Я верю, что самый простой способ - это сначала перейти к моменту, а затем набрать строку:

String d = new Date().toInstant().toString();

Что приведет к:

2017-09-08T12:56:45.331Z

5 голосов
/ 05 ноября 2015

Вы можете использовать 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();
}

Вы можете использовать:

TimeZone.getDefault ()

для часового пояса vm по умолчанию. Подробнее здесь

Вы можете заметить дату и время для нескольких часовых поясов, которые заканчиваются на 'Z'. Эти часовые пояса имеют смещение '0' от GMT.

Более подробную информацию можно найти здесь .

3 голосов
/ 05 мая 2018

tl; dr

Некоторые другие ответы верны в рекомендациях 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 произносится как «зулу» и означает UTC .

Ваш нужный формат соответствует стандарту ISO 8601 .Классы java.time по умолчанию используют эти стандартные форматы при разборе / генерации строк.Поэтому нет необходимости указывать шаблон форматирования.Просто позвоните по номеру Instant::toString, как показано выше.

Если вы хотите целые минуты без секунд или доли секунды, то обрежьте.Укажите единицу времени через 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 Framework встроен в 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?

  • 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 классов java.time.
    • Для более ранних версий Android (<26) адаптируется проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

2 голосов
/ 28 сентября 2017
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());
}
2 голосов
/ 14 ноября 2012

Вот целый класс, оптимизированный таким образом, что вызов "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());
    }
}
1 голос
/ 23 июня 2017

Я сделал это в Android, используя Calendar и 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;
}

REMEMBER: класс Date не знает о существовании TimeZone.По этой причине, если вы отлаживаете одну дату, вы всегда видите дату вашего текущего часового пояса.

1 голос
/ 08 декабря 2015

Тем не менее, joda-time поддерживает только расширенный формат: "2015-12-09T00: 22: 42.930Z" не основной "20151209T002242.930Z" ... возможно, лучше протестировать список форматов с помощью Java SimpleDateFormat.

0 голосов
/ 27 апреля 2018
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())
0 голосов
/ 03 апреля 2018

Им следовало бы добавить какой-то простой способ перехода от даты к мгновенному, а также метод под названием toISO8601, который ищут многие люди.В качестве дополнения к другим ответам, от java.util.Date до формата ISO 8601:

Instant.ofEpochMilli(date.getTime()).toString();

Это не очень заметно при использовании автозаполнения, но: java.time.Instant.toString():

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

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