Como você criaria programaticamente um padrão a partir de uma data armazenada em uma string?

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Pergunta

Tenho uma string que contém a representação de uma data.Parece:

Qui, 30 de novembro, 19:00:00 EST de 2006

Estou tentando criar um objeto Date usando SimpleDateFormat e tenho 2 problemas.

1.) Não consigo descobrir o padrão para codificar a solução no construtor SimpleDateFormat

2.) Não consigo encontrar uma maneira de analisar a string usando a API para determinar o padrão, para poder reutilizá-lo para diferentes padrões de saída de data

Se alguém souber uma solução usando API ou uma solução customizada eu agradeceria muito.

Foi útil?

Solução

O formato a ser passado para SimpleDateFormat pode ser consultado em http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

Quanto à sua segunda pergunta, não conheço nenhuma biblioteca Java que descubra um formato de data e analise-o sem saber antecipadamente qual é o formato.

Outras dicas

O analisador de data POJava org.pojava.datetime.DateTime é um analisador imutável e robusto que oferece suporte a vários idiomas, fusos horários e formatos.

O melhor de tudo é que o analisador é heurístico e não requer um “formato” pré-existente para funcionar.Você apenas passa uma string de texto de data/data e hora e obtém um java.util.Date!

Não tenho certeza se existe uma maneira fácil de analisar uma data e descobrir seu padrão, mas pensei que o padrão para aquela que você postou seria:

EEE MMM dd HH:mm:ss zzz aaaa

Se você quiser fazer outra coisa além de analisar ou formatar uma data, não há muito disponível para lidar com os padrões.Algum tempo atrás eu estava escrevendo um componente Swing para inserir datas em um campo de texto formatado.Você forneceu um padrão e ele moveu o cursor de entrada de texto pelos elementos desse padrão, permitindo apenas valores válidos.

Como parte disso, escrevi um DateFormatParser disponível aqui como parte do projeto de código aberto OpenHarmonise.

Analisar uma data em um padrão seria um problema extremamente interessante de resolver.Você teria que fazer certas suposições (por exemplo,uso de :em tempo, não em data), mas você enfrentaria os problemas eternos de anos de 2 dígitos e arranjos de dia/mês ou mês/dia.

Vale a pena saber que o formato de data fornecido não é arbitrário.É a saída do método Date.toString() integrado (pelo menos nas localidades do Reino Unido e dos EUA).Não por coincidência, é também o formato do comando unix 'date' (pelo menos no Linux, e acredito em outras implementações também) - embora seja pedante, Date.toString() preenche números de dias de um dígito com zero enquanto data unix não.

O que isso significa é que você provavelmente receberá esse formato de entrada ao gerar uma data não formatada em um campo modificável pelo usuário (por exemplo,um campo HTML INPUT) e recebê-lo de volta sem modificações.Então, só porque a entrada vem nesse formato não significa que os usuários digitarão milhares de outros formatos arbitrários.

Claro, eles ainda podem.A maneira como eu lido com entradas de data em geral é com vários blocos try/catch, onde eu tento em um formato, depois em outro e depois em outro.Nossa estrutura padrão agora tem cerca de 20 formatos diferentes por padrão.É claro que ainda não é perfeito;Outro dia encontrei alguém digitando "03 de setembro" como data (uma abreviatura de mês fora do padrão e sem ano) e não havíamos resolvido esse cenário.

Veja o Apache Commons' DataUtils.Há um parseDate método que leva o seu String e vários padrões para tentar cuspir um Date instância.

Como outros já disseram, o padrão parece que deveria ser

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

Quanto à análise de uma data de formato arbitrário, não conheço nenhuma biblioteca que faça isso em Java.Se você estivesse interessado em desenvolver tal coisa, eu começaria examinando o perl str2time função.

Devo dizer que acho a outra questão muito interessante.Porém, há um problema sério - analise isto:07/08/06!Se você se limitar a um subconjunto de formatos esperados, provavelmente poderá resolver o problema brincando com regexps, poderá criar vários padrões esperados e, em seguida, quebrar Strings em espaços ou qualquer outra coisa, e combinar parte por parte.

Você está apenas pedindo o padrão para aquela data?Se sim, acho que isso deveria bastar:

"EEE MMM d HH:mm:ss z yyyy"

Ou você está tentando pegar qualquer data formatada, inferir o formato e analisá-lo?

Que tal:

EEE MMM dd HH:mm:ss zzz yyyy

Basta passar a string para o construtor de SimpleDateFormat.Para usar o objeto, basta chamar o método parse passando a string que deseja converter em Data.

Você poderia dar uma olhada em:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Isso não é realmente a mesma coisa, mas você pode querer ver algo como JChronic, que pode fazer processamento de linguagem natural em datas.Portanto, a data de entrada pode ser algo como “amanhã” ou “duas semanas a partir da próxima terça-feira”.

Isso pode não ajudar em nada para o seu aplicativo, mas, novamente, pode.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top