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")
Foi útil?

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.

Jodá Exemplo:

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

scroll top