Вывод RFC 3339 Временная метка в Java
Я хочу вывести временную метку со сдвигом 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")
Ответы
Ответ 1
Начиная с 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
Ответ 2
Проверьте 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);
Ответ 3
Из "get it done dept" одно решение - использовать регулярные выражения для исправления строки после завершения 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");
}
Ответ 4
Я потратил немало времени на поиск ответа на ту же проблему, и я нашел что-то здесь: 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". Надеюсь, что это поможет.
Ответ 5
Проблема в том, что Z создает смещение часового пояса без двоеточия (:) как разделитель.
Ответ 6
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
Не то, что вам нужно?
Ответ 7
Я нашел бродячий 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");
Ответ 8
Я создал класс InternetDateFormat для RFC3339.
Но комментарий к исходному коду - японский.
PS: Я создал английское издание и немного рефакторинг.