Saída RFC 3339 Timestamp em Java
Pergunta
Eu quero mostrar um timestamp com um PST compensados ??(por exemplo, 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat
não parece deslocamentos de fuso horário de saída no , hora, minuto formato, que exclui do cólon. Existe uma maneira simples de obter que timestamp em 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?
Além disso, SimpleDateFormat
pode não analisar corretamente o exemplo acima. Ele lança uma ParseException
.
// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
Solução
A partir de Java 7, há a cadeia padrão X
para ISO8601 fuso horário. Para cadeias no formato que você descreve, uso XXX
. Consulte a documentação .
Amostra:
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
.format(new Date()));
Resultado:
2014-03-31T14:11:29+02:00
Outras dicas
Confira o href="http://www.joda.org/joda-time/" rel="nofollow pacote Joda Tempo . Eles fazem RFC 3339 data de formatação muito mais fácil.
DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);
A partir da "obtê-lo dept done", uma solução é usar expressões regulares para consertar a cadeia depois SimpleDateFormat foi concluída. Algo como s / (\ d {2}) (\ d {2}) $ / $ 1: $ 2 / em Perl.
Se você está mesmo interessado remotamente neste, eu vou editar esta resposta com o código Java funcionando.
Mas, sim. Eu estou batendo este problema também. RFC3339, eu estou olhando para você!
EDIT:
Isso funciona para mim
// 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");
}
Eu passei um monte de tempo à procura de uma resposta para o mesmo problema e eu encontrei algo aqui: http://developer.android.com/reference/java/text/SimpleDateFormat.html
resposta sugerida:
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());
Se você notar que estou usando 5 'Z', em vez de um. Isto dá a saída com dois pontos na compensação como este: "2008-11-13T12: 23: 30-08: 00". Espero que ajude.
O problema é que Z produz o deslocamento sem dois pontos (:) como separador de fuso horário.
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
Não é exatamente o que você precisa?
Eu encontrei um Pastebin perdida que me ajudou com a questão: http://pastebin.com/y3TCAikc
Apenas no caso do seu conteúdo mais tarde ficar excluído:
// 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");
Eu fiz uma href="http://mericleclerin.blogspot.jp/2013/07/internetdateformat-for-rfc3339.html" rel="nofollow"> InternetDateFormat classe para RFC3339.
Mas comentário código fonte é japonês.
PS:. Eu criei edição Inglês e refatoração um pouco