Qual é a melhor maneira de analisar uma data no formato MM / DD / AA e ajustá-lo à corrente / século anterior?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Um dos nossos clientes quer ser capaz de entrar uma data com apenas 2 dígitos para o componente de ano. A data será no passado, por isso queremos que o trabalho para o século anterior se o ano de 2 dígitos é após o ano em curso, mas o trabalho para o século atual, se o ano de 2 dígitos é igual ou inferior ao ano corrente.

a partir de hoje 10/30/2008

01/01/01 = 01/01/2001

01/01/09 = 1909/01/01

Esta é uma exigência estranha, e eu resolvi o problema, eu só não gosto de minha solução. Parece que há uma maneira melhor de fazer isso.

Obrigado pela ajuda.

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}
Foi útil?

Solução

roteiro Groovy (fácil o suficiente para jogar em java) demonstrando a @bobince ponto feito sobre SimpleDateFormat.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

Os rendimentos

2001-01-01
2008-10-30
1909-01-01

Outras dicas

SimpleDateFormat já faz anos análise de dois dígitos para você, usando as duas letras ‘aa’ formato. (Ele ainda vai permitir que quatro dígitos, obviamente.)

Por padrão, ele usa agora 80 ? agora + 20, por isso não é exatamente a mesma regra que se propõe, mas é razoável e padronizada (no mundo Java, pelo menos), e pode ser substituído usando set2DigitYearStart () se você quiser .

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

A longo prazo, tentar migrar para ISO8601 data formatação (AAAA-MM-DD), porque MM / dd / aa é aproximadamente o pior formato de data possível e é obrigado a causar problemas eventualmente.

Como sobre isto:

public static String anEasierStupidDateWithNoStringParsing(String dateString) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    //handling ParseExceptions is an exercise left to the reader!
    Date date = df.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    Calendar now = Calendar.getInstance();
    if (cal.after(now)) {
        cal.add(Calendar.YEAR, -100);
    }

    return cal;
}

Em outras palavras, vamos SimpleDateFormat analisar a cadeia e apenas ajustar o ano para ser o século anterior se SimpleDateFormat ( que tem suas próprias regras para interpretar cordas ano ) retorna uma data que é posterior à data atual.

Isto garantiria que todas as datas retornados são no passado. No entanto, ele não conta para quaisquer datas que podem ser analisados ??como antes este século passado - por exemplo, com o MM/dd/yyyy formato, um texto de data como "01/11/12" Processa a 11 de janeiro , 12 AD

Se Joda O tempo é uma opção:

String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
    dateTime = dateTime.minus(Years.ONE);
}

return dateTime.toString("MM/dd/yyyy");

Eu sei Joda O tempo não é parte do Java SE, e como eu disse em outro segmento, eu normalmente não tolerar usando uma biblioteca de terceiros quando há uma biblioteca Java que faz a mesma coisa. No entanto, a pessoa que está desenvolvendo Joda Time, também está levando JSR310 -. A API Hora Data e que vai fazê-lo em Java 7. Então eu Joda Tempo é basicamente vai ser em futuras versões de Java

Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

Trabalho para mim.

Pivot Ano Em Joda-Time

O excelente Joda-Time 2.5 biblioteca inclui essa funcionalidade. Não há necessidade de escrever qualquer código você mesmo. Basta ligar para withPivotYear() em um DateTimeFormatter . Veja que doc ligado para exemplos de como usá-lo.

A melhor maneira é usar a API Joda Time for datas e horários em Java.

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