Eu tenho uma string de data e quero analisá-la para a data normal, use a API java Date, o seguinte é o meu código:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
No entanto, eu tenho uma exceção: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Então, eu me pergunto se tenho que dividir a string e analisá-la manualmente?
BTW, tentei adicionar um caractere de aspas simples em ambos os lados do T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Também não funciona.
java
date
simpledateformat
iso8601
hguser
fonte
fonte
T
representa a hora e faz parte do padrão ISO8601 para formatação de data e hora internacional.T
aspas simples funcionou para mim (pelo menos em termos de solução do erro de análise).Respostas:
Atualização para Java 8 e superior
Agora você pode simplesmente fazer
Instant.parse("2015-04-28T14:23:38.521Z")
e obter a coisa correta agora, especialmente porque você deve estar usando emInstant
vez de estar quebradojava.util.Date
com as versões mais recentes do Java.Você deve usar em
DateTimeFormatter
vez deSimpleDateFormatter
também.Resposta original:
Isso funciona com a entrada com o final,
Z
conforme demonstrado:Q2597083.java
Produz a seguinte saída:
fonte
tl; dr
Use a
java.time.Instant
classe para analisar o texto no formato ISO 8601 padrão, representando um momento no UTC.ISO 8601
Esse formato é definido pelo padrão ISO 8601 para os formatos de string de data e hora.
Ambos:
… Use os formatos ISO 8601 por padrão para analisar e gerar strings.
Geralmente, você deve evitar o uso das classes java.util.Date /.Calendar e java.text.SimpleDateFormat antigas , pois são notoriamente problemáticas, confusas e com falhas. Se necessário para interoperar, você pode converter para lá e para cá.
java.time
Construído no Java 8 e posterior, está a nova estrutura java.time . Inspirado no Joda-Time , definido pelo JSR 310 , e estendido pelo projeto ThreeTen-Extra .
Converta para a classe antiga.
Fuso horário
Se necessário, você pode atribuir um fuso horário.
Converter.
Joda-Time
ATUALIZAÇÃO: O projeto Joda-Time agora está no modo de manutenção. A equipe aconselha a migração para as classes java.time .
Aqui está um exemplo de código no Joda-Time 2.8.
Converta para a classe antiga. Observe que o fuso horário atribuído é perdido na conversão, pois o juDate não pode ser atribuído a um fuso horário.
Fuso horário
Se necessário, você pode atribuir um fuso horário.
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 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
O projeto ThreeTen-Extra estende 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
Há duas respostas acima up-to-e agora eles são ambos muito tempo (e tl; dr IMHO muito curta), então eu escrever resumo da minha experiência de começar a usar nova java.time biblioteca (aplicável como observado em outras respostas a versão Java 8+). A ISO 8601 define a maneira padrão de escrever datas:
YYYY-MM-DD
portanto, o formato da data e hora é apenas o seguinte (pode ser de 0, 3, 6 ou 9 dígitos por milissegundos) e nenhuma sequência de formatação é necessária:Eu não precisava disso, mas como obter ano está no código da pergunta, então:
é mais complicado, não pode ser feito
Instant
diretamente, pode ser feito viaCalendar
meio de perguntas Obtenha valor inteiro do ano atual em Java e Convertendo java. tempo para o calendário, mas IMHO como formato é substring fixo é mais simples de usar:fonte