Вывод временной метки RFC 3339 в Java
Вопрос
Я хочу вывести временную метку со смещением по тихоокеанскому стандартному времени (например, 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")
Решение
Начиная с 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
Другие советы
Ознакомьтесь с пакетом Joda Time . Они значительно упрощают форматирование даты RFC 3339.
Пример Joda:
DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);
Одним из решений отдела «довести дело до конца» является использование регулярных выражений для исправления строки после завершения SimpleDateFormat.Что-то вроде s/(\d{2})(\d{2})$/$1:$2/ в Perl.
Если вас это хотя бы отдаленно интересует, я отредактирую этот ответ, используя рабочий Java-код.
Но да.Я тоже сталкиваюсь с этой проблемой.RFC3339, я смотрю на тебя!
РЕДАКТИРОВАТЬ:
Это работает для меня
// 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");
}
Я потратил довольно много времени в поисках ответа на ту же проблему и нашел кое-что здесь: http://developer.android.com/reference/java/text/SimpleDateFormat.html р>
Предлагаемый ответ:
Строка timestamp = new SimpleDateFormat (" гггг-мм-дд'Т'h: m: ssZZZZZ "). format (new Date ());
Если вы заметили, я использую 5 'Z' вместо одного. Это дает вывод с двоеточием в смещении, например: «2008-11-13T12: 23: 30-08: 00». Надеюсь, это поможет.
Проблема в том, что Z создает смещение часового пояса без двоеточия (:) в качестве разделителя.
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
Разве не то, что именно вам нужно?
Я нашел случайную вставку 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");
Я создал InternetDateFormat класс для RFC3339. р>
Но комментарий к исходному коду - японский.
PS: я создал английское издание и немного изменил рефакторинг.