Eu tenho a seguinte data: 2011-08-12T20:17:46.384Z
. Que formato é esse? Estou tentando analisá-lo com Java 1.4 via DateFormat.getDateInstance().parse(dateStr)
e estou recebendo
java.text.ParseException: Data imperceptível: "2011-08-12T20: 17: 46.384Z"
Eu acho que eu deveria estar usando SimpleDateFormat para análise, mas eu tenho que saber a seqüência de formato primeiro. Tudo o que tenho até agora é yyyy-MM-dd
porque não sei o que T
significa essa string - algo relacionado ao fuso horário? Essa sequência de datas é proveniente da lcmis:downloadedOn
tag mostrada no tipo de mídia do histórico de downloads Arquivos CMIS .
Z
final é curtoZulu
e significa UTC . Esse formato certamente faz parte da coleção ISO 8601 de formatos de texto padrão de data e hora. A propósito, esses formatos padrão são usados por padrão nas classes java.time .java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle .Respostas:
AT é apenas um literal para separar a data da hora e Z significa "deslocamento da hora zero", também conhecido como "hora do Zulu" (UTC). Se suas strings sempre tiverem um "Z", você poderá usar:
Ou usando o Joda Time , você pode usar
ISODateTimeFormat.dateTime()
.fonte
T
eZ
?T
(não me lembro como o SimpleDateFormat lida com especificadores desconhecidos), masZ
queremos que seja o caractere 'Z' em vez de "um valor de deslocamento UTC" (por exemplo, "00").tl; dr
O formato ISO 8601 padrão é usado pela sua sequência de entrada.
ISO 8601
Este formato é definido pela norma prática sensata ISO 8601 .
O
T
separa a parte da data da parte da hora do dia. OZ
final significa UTC (ou seja, um deslocamento do UTC de zero horas-minutos-segundos). OZ
é pronunciado "Zulu" .java.time
As antigas classes de data e hora incluídas nas versões mais antigas do Java provaram ser mal projetadas, confusas e problemáticas. Evite-os.
Em vez disso, use a estrutura java.time incorporada no Java 8 e posterior. As classes java.time substituem as classes antigas de data e hora e a biblioteca Joda-Time de grande sucesso.
As classes java.time usam o ISO 8601 por padrão ao analisar / gerar representações textuais de valores de data e hora.
A
Instant
classe representa um momento na linha do tempo no UTC com uma resolução de nanossegundos . Essa classe pode analisar diretamente sua sequência de entrada sem se preocupar em definir um padrão de formatação.Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .fonte
Não tenho certeza sobre a análise de Java, mas isso é ISO8601: http://en.wikipedia.org/wiki/ISO_8601
fonte
Existem outras maneiras de analisá-lo, em vez da primeira resposta. Para analisá-lo:
(1) Se você deseja obter informações sobre data e hora, é possível analisá-las em um objeto
ZonedDatetime
(desde Java 8 ) ouDate
(antigo):ou
(2) Se você não se importa com a data e a hora e apenas deseja tratar as informações como um momento em nanossegundos, pode usar
Instant
:fonte
Se vocês estão procurando uma solução para Android, podem usar o código a seguir para obter os segundos da época da sequência do carimbo de data / hora.
Entrada de amostra: 2019-10-15T05: 51: 31.537979Z
Saída de amostra: 1571128673
fonte
Você pode usar o exemplo a seguir.
fonte
Z
. Isso significa esperar, mas ignorar essa carta. Mas essa carta não deve ser ignorada. Essa carta fornece informações valiosas, o fato de que a string foi projetada para o UTC, um deslocamento de zero. Seu formato está descartando esse fato importante. Além disso, não há necessidade de se preocupar em definir esse padrão de formatação. Um formatador para este padrão é construído em.Essa técnica converte java.util.Date para o formato UTC (ou qualquer outro) e vice-versa.
Defina uma classe assim:
}
Em seguida, use-o assim:
ou
Você também pode definir outros formatos de data se precisar (e não apenas o UTC)
fonte
java.util.Date
o projeto quanto o Joda-Time foram suplantados anos atrás pelas modernas classes java.time definidas no JSR 310. A recomendação aqui está desatualizada há muito tempo.@ John-Skeet me deu a pista para corrigir meu próprio problema em torno disso. Como programador mais jovem, esse pequeno problema é fácil de perder e difícil de diagnosticar. Então, eu estou compartilhando na esperança de ajudar alguém.
Meu problema foi que eu queria analisar a seguinte sequência restringindo um carimbo de data / hora de um JSON sobre o qual não tenho influência e colocá-lo em variáveis mais úteis. Mas eu continuava recebendo erros.
Portanto, considerando o seguinte (preste atenção ao parâmetro string dentro dePattern ();
Erro:
O problema? O Z no final do Padrão precisa ser envolto em 'Z', assim como o 'T'. Mude
"yyyyMMdd'T'HHmmss.SSSZ"
para"yyyyMMdd'T'HHmmss.SSS'Z'"
e funciona.Remover o Z do padrão também levou a erros.
Francamente, eu esperaria que uma classe Java tivesse antecipado isso.
fonte
T
é um literal e precisa ser citado,Z
é um deslocamento (de zero) e precisa ser analisado como tal, ou você obterá resultados incorretos. Não sei o que você quer dizer com não foi antecipado, acredito que sim.Z
. Você está descartando informações valiosas. Processar um valor de data e hora enquanto ignora o fuso horário ou compensar o UTC é como processar uma quantia de dinheiro enquanto ignora a moeda!T
meramente separa a parte da data da parte da hora do dia e não adiciona significado. PorZ
outro lado, definitivamente acrescenta significado.