Como analisar apenas quatro dígitos (com o tempo de Joda)?
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...
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.