2017-02-21 20 views
0

Как вы отформатируете дату в ISO 8601? Например: 2009-06-15T13:45:30Получение формата даты ISO 8601, например .: 2009-06-15T13: 45: 30

Есть ли стандартный способ генерации его из Java без необходимости создавать DateTimeFormatter с шаблоном письма?

Я вижу, что используется в MS документации: Standard Date and Time Format Strings

+1

https://en.wikipedia.org/wiki/ISO_8601 –

+1

Это ISO формат 8601 и вы можете форматировать такую ​​строку, используя спецификатор формата s (сортируемый) (в C#). – Evk

+1

@ Evk Это * почти * ISO 8601 формат - отсутствует идентификатор часового пояса. – 1615903

ответ

0

Легкие способы получить ISO 8601 в Java:

static void time() { 
    final DateTimeFormatter fmt = DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
    OffsetDateTime.now().truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    Instant.now().atOffset(ZoneOffset.ofHours(1)).truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    Instant.now().atOffset(ZoneOffset.UTC).truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    OffsetDateTime.parse("2007-12-03T10:15:30+01:00").format(fmt); 
    LocalDateTime.parse("2009-06-15T13:45:30").format(fmt); 
} 
3

Я думаю, что это обычно называют датой «ISO».

Документально в wikipedia], давая такие примеры, как:

Date: 2017-02-21 
Combined date and time in UTC: 2017-02-21T10:26:42+00:00 
           2017-02-21T10:26:42Z 
           20170221T102642Z 

Одна вещь, чтобы быть ясно: ваши примеры идут без часового пояса информации; поэтому их следует считать «местным временем».

3

В этой строке T - это только компонент времени в стандартной строке времени ISO 8601, представленный как <date>T<time>. Википедия имеет detailed page об этом стандартном формате.

В Java, вы можете сделать это, чтобы использовать его

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 

Я использовал GMT здесь только для примера. Вы можете установить часовой пояс в соответствии с вашими потребностями. Для получения более подробной информации о TimeZone здесь Документы link

+1

Только для записи: «Z» подразумевает UTC (ну, на самом деле, нет часового пояса); и да, GMT - это как-то UTC, но я думаю, что для того, чтобы быть действительно точным, вы должны использовать «UTC» в своем примере. – GhostCat

+0

Я написал GMT, потому что я однажды читал «GMT - это часовой пояс, а UTC - это стандарт времени», поэтому я подумал, что когда я пытаюсь getTimeZone(), я упоминаю Time Zone.^_^@GhostCat –

+0

Согласен, это не совсем понятно. Возможно, лучшим решением было бы упомянуть о терминологической части вашего ответа. – GhostCat

2

ISO-8601 Единственного момент времени может быть представлена ​​конкатенацией полного выражения даты, буква T в качестве разделителя, и допустимое выражения времени. Например, «2007-04-05T14: 30».

2

Формат такой даты является местным временем даты ISO 8601, без часового пояса. Согласно Википедии, дате и времени, выраженную в соответствии с ISO 8601 являются:

Date:       2017-02-21 

Combined date and time in UTC: 2017-02-21T12:34:46+00:00 
           2017-02-21T12:34:46Z 
           20170221T123446Z 
... 

Там вы несколько способов создания строк с помощью такого формата в Java. В Java 8 самым простым способом является использование встроенного шаблона разбора LocalDateTime. Причина, по которой я не использую ZonedDateTime, заключается в том, что временная зона этой даты неизвестна.

// str -> date 
LocalDateTime d = LocalDateTime.parse("2009-06-15T13:45:30"); 

// date -> str 
String text = d.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); 

ISO 8601: Time zone designators

+0

Исправление: «Местное» значение даты без смещения * определено и разрешено стандартом [ISO 8601] (https://en.m.wikipedia.org/wiki/ISO_8601). –

+0

Спасибо, что просмотрели мой ответ @BasilBourque. Ответ теперь обновлен :) –