Як отримати поточний момент у форматі ISO 8601 з датою, годиною та хвилиною?


323

Який найелегантніший спосіб отримати презентацію поточного моменту у форматі ISO 8601 , UTC? Він повинен виглядати наступним чином : 2010-10-12T08:50Z.

Приклад:

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


5
@marcolopes Обережно, використання A private static SimpleDateFormatне є безпечним для потоків.
vegemite4me


Подібний до цього іншого питання , але той скорочує цілий другий, тоді як цей питання обрізає цілу хвилину.
Василь Бурк

Відповіді:


292

Використовуйте 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()як показано вище, буде форматувати поточний час.


8
@Joachim Негативна сторона цього "стандартного" підходу полягає в тому, що мені потрібно мати багато примірників "yyyy-MM-dd'T'HH:mmZ"у своїй заяві, кожен раз, коли мені потрібна дата, відформатована ISO-8601. З JodaTime, як я бачу, я можу використовувати заздалегідь визначений формат ISODateTimeFormat, який виконує цю роботу для мене ..
yegor256

8
@Joachim, Zдіє шаблон в SimpleDateFormat, а зробити це: yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi

33
-1 Це дає вам дату / час у поточному часовому поясі - не UTC. Відповідь Карлоса включає необхідний код UTC.
Скотт Ріппі

16
Я просто виправив помилку часового поясу - оскільки це прийнята відповідь, я думаю, що це було правильно зробити.
BoD

2
Z потрібно цитувати як "yyyy-MM-dd'T'HH: mm'Z" "
Kimball Robinson

224

Для систем, де часова зона за замовчуванням не є 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 Time, якщо роблю багато різних маніпуляцій з часом / датою ...
EDIT2: виправлено: setTimeZoneне приймає рядок (виправлено Полом)


9
Цей формат не є постійною ніде в якійсь вбудованій бібліотеці?
Даніель Каплан

Є два різних пакети для 'DateFormat', не забудьте використовувати 'import java.text.DateFormat'
oabarca

3
Якщо потрібно поточний часовий пояс, використовуйте TimeZone tz = TimeZone.getDefault (); натомість
oabarca

Ви повинні НЕ процитувати «Z» в форматі , так що робить його логічно незначним. Якщо TimeZone є UTC, як у наведеному вище прикладі, тоді без котирування Z виводиться лише Z на виході ... однак, якщо TimeZone не є UTC, Z все одно виводиться як буквальний, що передбачає UTC, коли час не може бути. Якщо система, що споживає, читає Z як UTC, але час не час буде зміщено. І навпаки, якщо аналізатор використовує цитоване Z без встановлення TimeZone, він розбере UTC-раз як локальний час (знову зміщується). Ця цитата не потрібна, якщо встановлено TZ, але небезпечна, якщо її немає.
Метт Віппл

@MattWhipple - але якщо ви будете використовувати без котирування Z, результат буде чимось на зразок 2016-06-14T13:56+0000- питання 2016-06-14T13:56Z
задається

184

Java 8 Рідний

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 . Обидва легше Joda, і дізнався від Joda по досвіду - осіб. враховуючи, що java.time розроблений автором Joda.


9
Хороша відповідь. Зауважте добру звичку чітко вказувати часовий пояс, а не посилатися неявно на поточний часовий пояс JVM. За бажанням ви можете вказати певний часовий пояс , наприклад ZoneId.of( "America/Montreal" ).
Василь Бурк

1
Instant дозволяє відформатувати його у форматі ISO 8601, просто зателефонувавши до методу .toString ():return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL

Це найкраще, тому що ви уникаєте дефолту.
Крістоф Руссі

6
Попередження: Рішення для Java 8 з використанням ISO_INSTANT має дратівливу химерність. Коли мілісекунд дорівнює 0, вони не включаються у висновок. Це дозволено відповідно до стандарту ISO 8601, але багато бібліотек та аналізаторів іншими мовами не прощають. Якщо потрібно завжди включати нулі, використовуйте це замість: DateTimeFormatter ISO_8601 = ofPattern ("yyyy-MM-dd'T'HH: mm: ss.SSSX"). WithZone (UTC);
jurgen

Після переходу з Java 8 на 11 я бачу DateTimeFormatter.ISO_INSTANTі DateTimeFormatter.ISO_DATE_TIMEвикористовую 6 цифр після секунд, на відміну від 3, які вже не сприймаються Spring's @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
DanielM

126

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'    Час, відформатований для цілодобового годинника як "% tH:% tM"
'F'    ISO 8601, повна дата відформатована як "% tY-% tm-% td".


26
Що ж, або ви включаєте додаткову сторонній бібліотеку як залежність від свого проекту (який ви, можливо, хочете бути в курсі, і відправляєте разом зі своїм додатком, ей, це лише зайві 3,2 мегабайти) і робити DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, або ви робите інкапсуляцію return String.format("%tFT%<tRZ", new Date());в клас, і робіть str = Iso8601Time.now(), де вам це потрібно. (Це не так, як зміниться формат ISO.) Якщо виявиться, що вам потрібно більше, ніж просто поточна дата у форматі ISO, скористайтеся lib.
aioobe

2
Повністю згоден з цим.
yegor256

3
Зауважте, що можна змінити, яку відповідь позначено як прийняту ;-)
aioobe

8
%tFT%<tTZбуде включати секунди; %tFT%<tTZ.%<tLбуде включати мілісекунди.
Патрік Лінскі

2
Дуже акуратне рішення, має бути прийнятою відповіддю на сьогодні :)
AbdelHady

94

З Java 8 ви можете просто зробити:

Instant.now().toString();

З java.time.Instantдокументів:

зараз

public static Instant now()

Отримує поточний момент із системних годин.

Це буде запитувати системний годинник UTC, щоб отримати поточний момент.

 


public String toString()

Рядок подання цього моменту з використанням ISO-8601 подання.

Використовуваний формат такий самий, як і формат DateTimeFormatter.ISO_INSTANT.


11
Це правильна відповідь, і це скандал, що він не звертався вище за всі придумані SimpleDateFormats.
Девід Молес

Радий, що я прочитав більше відповідей. Я погоджуюся, це має бути відповідь зараз.
Ксан-Кун Кларк-Девіс

А тому що це toString, у багатьох випадках, вам навіть не потрібно буде чітко називати це.
kaya3

1
Попередження в коментарі до попередньої відповіді застосовується і тут: "Попередження: Рішення для Java 8 з використанням ISO_INSTANT має дратівливу химерність. Коли трапляється мілісекунд 0, вони не включаються у висновок. Це дозволено згідно ISO 8601 стандарт, але багато бібліотек і аналізаторів іншими мовами не прощають ".
Дейв Л.

27

використовувати JodaTime

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

Ось документ для форматора JodaTime

Редагувати:

Якщо ви не хочете додавати або якщо ви не бачите значення додавання вище бібліотеки, ви можете просто використовувати у вбудованому SimpleDateFormatкласі для форматування дати до необхідного формату ISO

як запропонував @Joachim Sauer

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

3
І як би ви створили рядок, сформовану як показано у запитанні?
Йоахім Зауер

4
Я б сказав, що не додайте залежність бібліотеки для чогось такого простого (що можна досягти за допомогою двох рядків java-коду). (Звичайно, якщо вимоги зростають, це вже інша історія.)
aioobe

1
@aioobe, якщо його щойно використовували в декількох додатках, тоді його нормально перейти за замовчуванням, в іншому випадку jodatime краще.
Джигар Джоші

5
@aioobe jodatime краще в будь-якому випадку, тому що він ISODateTimeFormat- заздалегідь визначений форматник ISO-8601.
yegor256

3
@ org.life.java: які актуальні лише тоді, коли ви можете правильно переключитися на час Jode. У вас їх не буде, коли ви використовуєте лише цю функцію часу Joda.
Йоахім Зауер

20

DateFormatUtils від Apache commons-lang3мають корисні константи, наприклад:DateFormatUtils.ISO_DATETIME_FORMAT


3
Більш точно, на поточний момент в UTC: DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));поточний момент за замовчуванням в часовому поясі: DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256 дякую, що згадуєте DateFormatUtils, що на борту apache commons-lang варто використовувати формат дати.
бабінік

19

Якщо ви не хочете включати Jodatime (так добре, як це є)

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

який повертає рядок:

2012-07-10T16:02:48.440Z

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



10

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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - 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), то ThreeTenABP проект адаптує ThreeTen-Backport (згаданий вище). Див. Як користуватися ThreeTenABP… .

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


7

Для версії 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

Ви можете використовувати 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.

Більше інформації можна знайти тут .


5

Я вірю, що найпростішим способом є спочатку перейти до миттєвого, а потім на рядкового типу:

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

Що призведе до:

2017-09-08T12:56:45.331Z


4
Якщо ви хочете поточного часу, немає необхідності переглядати старомодний Dateоб’єкт. Просто роби Instant.now().toString(). Якщо у вас Dateє старий API, ваш метод є найкращим.
Оле ВВ

Як зауважив Оле В.В., тривожні старі класи, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

5

тл; д-р

Деякі з інших відповідей є правильними в тому, щоб рекомендувати класи 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 каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, іSimpleDateFormat.

Проект Joda-Time , який зараз знаходиться в режимі технічного обслуговування , радить перейти на java.timeкласів .

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - 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), то ThreeTenABP проект адаптує ThreeTen-Backport (згаданий вище). Див. Як користуватися ThreeTenABP… .

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


2

Ось цілий клас оптимізований так, що виклик "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());
    }
}

9
Зробити його статичним може спричинити проблеми, оскільки SimpleDateFormat не є безпечним для потоків: "Формати дати не синхронізовані. Рекомендується створювати окремі екземпляри формату для кожного потоку. Якщо декілька потоків одночасно мають доступ до формату, він повинен бути синхронізований зовні". docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
Як зазначав @Juha Palomäki, це не безпечно. Якщо ви використовуєте Java 8 або вище, ThreadLocal.withInitial може це виправити. Якщо ви використовуєте Java 7 або новішу версію, створіть нову ThreadLocal та введіть початкове значення, перемінивши ThreadLocal.initialValue
user393274

@ User393274 - якщо ви використовуєте Java 8 слід використовувати Instant, DateTimeFormatі інші сучасні потокобезпечна заміни

Я трохи здивований тим, що проблема у SimpleDateFormat не є безпечною для потоків. Якщо два потоки виконують статичний ініціалізатор одночасно, я не бачу нічого гіршого, ніж конструктор SimpleDateFormat отримує виклик двічі, але лише один момент (останній, який закінчується) записується як "df".
gilbertpilz

2
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());
}

1

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


1

Я робив це в Android за допомогою календаря та SimpleDateFormat. Наступний метод повертає Календар із часовою зоною "GMT" (це універсальний часовий пояс). Потім ви можете використовувати клас Календар для встановлення години між різними часовими поясами, використовуючи метод setTimeZone () класу Календар.

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;
}

ПАМ’ЯТАЙТЕ: Клас Дата не знає про існування TimeZone. З цієї причини, якщо ви налагоджуєте одну дату, ви завжди бачите дату для вашого поточного часового поясу.


1

Якщо ви дбаєте про продуктивність, я створив бібліотеку, яка перевершує стандартний Java-аналізатор та форматник під час маніпулювання датами у форматі ISO8601. Реалізації DatetimeProcessor є безпечними для потоків і можуть кешуватися у паралельній карті чи статичних полях.

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}

0

Вони повинні були додати якийсь простий спосіб перейти від дати до миттєвого пошуку, а також метод під назвою toISO8601, який шукає багато людей. Як доповнення до інших відповідей, від формату java.util.Date до формату ISO 8601:

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

Це не дуже видно при використанні автоматичного завершення, але: java.time.Instant.toString() ::

Рядкове представлення цього моменту за допомогою ISO-8601


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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Вішал Чходвані

-2

Спробуйте це,

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

Її для формату ISO 8601


2
Це використовує дати в неправильному часовому поясі, див. Відповідь Карлоса.
Stian Soiland-Reyes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.