Pergunta

Existe uma maneira de forçar o tempo de Joda para analisar datas apenas quando elas contêm quatro anos de dígitos? Por exemplo:

  • 2009-11-11-deve analisar
  • 09-11-11-não deve analisar

Tentei o seguinte código:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

Passa em 0009-11-11. Aparentemente, o Mindigits no método Apêndyear é usado apenas para formatar ao imprimir a data.
O resultado é o mesmo se eu usar o appendyearofera (). Se eu usar o AppendYearOf Century (), ele analisa o ano em 1909.

Estamos implementando um analisador de dados geral, que reconhecerá vários tipos de insumos. Além disso, o exemplo é uma forma reduzida do negócio real (por simplicidade). Cenários da vida real Parses datas que podem ter dias de semana, meses como palavras, tempo, zona e personagens diferentes que separam mês, dia e ano. Portanto, escrever um regex ou verificar o conteúdo/comprimento da string pode ser bastante difícil.

Alguns exemplos reais poderiam ficar assim:

  • 2009-11-11
  • Quarta-feira 2009-11-11T15: 00: 00
  • 2009/11/11 15:00
  • e muitos mais...
Foi útil?

Solução

DateTimeFormTatterBuilder.AppendFixedDecimal () pode muito bem fazer o que você precisa.

Como alternativa, você pode implementar a interface DateTimeParser para criar o analisador que desejar e passá -lo para o Builder DateTimeFormTatter.

Outras dicas

Você pode verificar o comprimento da string de data.

Você pode construir analisadores e formatados extremamente específicos usando DateTimeFormatterBuilder. Geralmente, não há necessidade de usar essa classe diretamente, pois os formatos mais comuns estão disponíveis mais facilmente em outras partes da API, mas essa é a classe do construtor que todos usam sob as cobertas.

O que você deseja obter de um usuário que entra '0001-01-01' como a data (ou seja, eles entraram em 4 dígitos para o ano, mas os três primeiros foram zeros)? Que tal '0999-12-31'? E '999-12-31'? E quanto a '10000-01-01'-o infame Y10K1 problema?

  • Se esse é um valor legítimo, você está preso ao descobrir a duração do que o usuário digitou como parte do ano da data (provavelmente após qualquer outra análise ter sido feita) e certificando -se de que seja pelo menos (ou é exatamente ?) quatro dígitos.

  • Se isso não é um valor legítimo, você está preso à verificação do valor do ano após a data em que a data é analisada.

  • Ou você pode pegar o código e modificá -lo para incluir sua definição preferida de ano válido.


1 Não pretendo começar a trabalhar para corrigir o problema Y10K antes de 5000-01-02.

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