Выходная метка времени RFC 3339 в Java - PullRequest
35 голосов
/ 14 ноября 2008

Я хочу вывести временную метку со смещением PST (например, 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat не выводит смещения часового пояса в формате час: минута , исключая двоеточие. Есть ли простой способ получить эту метку времени в Java?

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

Кроме того, SimpleDateFormat не может правильно проанализировать пример выше. Бросает ParseException.

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")

Ответы [ 8 ]

40 голосов
/ 31 марта 2014

Начиная с Java 7, есть строка шаблона X для часового пояса ISO8601. Для строк в формате, который вы описываете, используйте XXX. См. Документацию .

Пример:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
        .format(new Date()));

Результат:

2014-03-31T14:11:29+02:00
16 голосов
/ 14 ноября 2008

Проверьте пакет Joda Time . Они значительно упрощают форматирование даты RFC 3339.

Йода Пример:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);
12 голосов
/ 16 июля 2012

Начиная с "делай это с делом", одним из решений является использование регулярных выражений для исправления строки после завершения SimpleDateFormat. Что-то вроде s / (\ d {2}) (\ d {2}) $ / $ 1: $ 2 / в Perl.

Если вам это даже интересно, я отредактирую этот ответ с помощью работающего кода Java.

Но да. Я тоже бьюсь над этой проблемой. RFC3339, я смотрю на тебя!

EDIT:

Это работает для меня

// As a private class member
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

String toRFC3339(Date d)
{
   return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2");
}
11 голосов
/ 20 мая 2015

Я потратил довольно много времени в поисках ответа на тот же вопрос, и нашел здесь кое-что: http://developer.android.com/reference/java/text/SimpleDateFormat.html

Предлагаемый ответ:

String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());

Если вы заметили, что я использую 5 'Z' вместо одного. Это дает вывод с двоеточием в смещении, например: «2008-11-13T12: 23: 30-08: 00». Надеюсь, это поможет.

4 голосов
/ 02 февраля 2009

Проблема в том, что Z создает смещение часового пояса без двоеточия (:) в качестве разделителя.

3 голосов
/ 14 ноября 2008
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");

Не то, что именно вам нужно?

1 голос
/ 17 мая 2013

Я создал InternetDateFormat класс для RFC3339.

Но комментарий к исходному коду - японский.

PS: я создал английское издание и немного изменил рефакторинг.

1 голос
/ 15 августа 2012

Я нашел беспризорную PasteBin, которая помогла мне с проблемой: http://pastebin.com/y3TCAikc

На случай, если позже его содержимое будет удалено:

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
...