Eu tenho o construtor SimpleDateFormat como
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
e eu estou analisando string "2013-09-29T18:46:19Z".
Eu li que aqui Z representa o GMT/UTC
fuso horário. mas quando imprimo esta data no console, imprime o fuso horário IST para a data retornada.
Agora, minha pergunta é se minha saída está certa ou errada?
java
date
timezone
date-format
simpledateformat
Pradip Borde
fonte
fonte
Respostas:
Você não definiu o fuso horário apenas para adicionar uma
Z
data / hora ao final da data / hora; portanto, ela parecerá uma data / hora GMT, mas isso não altera o valor.Defina o fuso horário como GMT e ele estará correto.
fonte
'T'
e'Z'
são considerados aqui como constantes. Você precisa passarZ
sem as aspas. Além disso, você precisa especificar o fuso horário na sequência de entrada.Exemplo:
2013-09-29T18:46:19-0700
E o formato como"yyyy-MM-dd'T'HH:mm:ssZ"
fonte
-0700
é o fuso horário, ou seja, -7: 00 HrsDe ISO 8601 String para Java Date Object
se você não definir
TimeZone.getTimeZone("GMT")
, ele exibiráSun Sep 29 18:46:19 CST 2013
Do objeto de data do Java para a sequência ISO 8601
E para converter um
Date
objeto no padrão ISO 8601 (yyyy-MM-dd'T'HH:mm:ss'Z'
), use o seguinte códigoObserve também que sem as impressões
' '
em Zyyyy-MM-dd'T'HH:mm:ssZ
2015-01-22T03:41:02+0000
fonte
SE você deseja manipular ' padrão representação' JSON da data então é melhor usar este padrão:
"yyyy-MM-dd'T'HH:mm:ssX"
.Observe o
X
no final. Ele manipulará fusos horários no padrão ISO 8601 e o ISO 8601 é exatamente o que produz essa declaração em Javascript.new Date().toJSON()
Comparando com outras respostas, tem alguns benefícios:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
fonte
play
a vinculação automática de formulários e uso@Format.DateTime
anotações. O uso do padrão padrão comZ
final parece estar incorreto. Depois de alterado paraX
, ele funciona. Muito obrigadotl; dr
As outras respostas estão obsoletas no Java 8.
ISO 8601
Por acaso, seu formato de string está em conformidade com o padrão ISO 8601 . Esse padrão define formatos sensíveis para representar vários valores de data e hora como texto.
java.time
As classes old
java.util.Date
/.Calendar
andjava.text.SimpleDateFormat
foram substituídas pela estrutura java.time incorporada no Java 8 e posterior. Veja o tutorial . Evite as classes antigas, pois elas provaram ser mal projetadas, confusas e problemáticas.Parte do design inadequado das classes antigas o mordeu, onde o
toString
método aplica o fuso horário atual da JVM ao gerar uma representação de texto do valor de data e hora que está realmente no UTC (GMT); bem-intencionado, mas confuso.As classes java.time usam os formatos ISO 8601 por padrão ao analisar / gerar representações textuais de valores de data e hora. Portanto, não há necessidade de especificar um padrão de análise.
An
Instant
é um momento na linha do tempo no UTC .Você pode aplicar um fuso horário conforme necessário para produzir um
ZonedDateTime
objeto.fonte
e se você não tiver a opção de continuar com o java8, use 'aaaa-MM-dd'T'HH: mm: ssX XX ', pois isso será analisado corretamente novamente (enquanto que com apenas um X isso pode não ser o caso. .. dependendo da sua função de análise)
X gera: +01
XXX gera: +01: 00
fonte
Para Java 8: você pode usar o embutido
java.time.format.DateTimeFormatter
para reduzir qualquer chance de erros de digitação, comoISO_ZONED_DATE_TIME representa
2011-12-03T10:15:30+01:00[Europe/Paris]
um dos formatos padrão de DateTime fornecidos pelo link Oraclefonte