Разное SimpleDateFormat parsen - PullRequest
       16

Разное SimpleDateFormat parsen

0 голосов
/ 20 сентября 2019

Я хочу проверить, соответствует ли дата одному из моих определенных шаблонов.Пожалуйста, смотрите ниже мой код.

date = null

List<String> formatStrings = Arrays.asList("yyyy-MM-dd", "dd.MM.yyyy", "yyyyMMdd", "yyyy/MM/dd", "dd/MM/yyyy");

        for (String formatStr: formatStrings) {
            try {
                dateType = new Date(new SimpleDateFormat(formatStr).parse(myCol).getTime());

            } catch (ParseException e) {}
        }
        return date;

Я также пытался:

 try { 
   for.. }
 catch {}

Я также написал модульный тест, чтобы проверить, работает ли моя функция, но она работает только тогда, когда моя переменнаяимеет шаблон: «гггг-ММ-дд» (поэтому первый в списке).И если у меня есть какой-либо другой шаблон, он показывает исключение ...

Не могли бы вы мне помочь?Какую строку я написал неправильно?

1 Ответ

1 голос
/ 21 сентября 2019

Избегайте устаревших классов даты и времени

Вы используете ужасные классы даты и времени, которые были годы назад вытеснены ведущими в отрасли современными java.time классами, определенными в JSR 310.

java.time

Переключитесь на использование LocalDate и DateTimeFormatter.

Пара ваших ожидаемых форматов предопределена DateTimeFormatter, каждый из которых является вариацией стандартных форматов ISO 8601 .Для остальных трех форматов мы определяем шаблон форматирования.

package work.basil.example;

import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.List;
import java.util.Objects;

public class Demo
{
    public static void main ( String[] args )
    {
        Demo app = new Demo ();
        app.demo ();
    }

    private void demo ( )
    {
        // ("yyyy-MM-dd", "dd.MM.yyyy", "yyyyMMdd", "yyyy/MM/dd", "dd/MM/yyyy"
        final List < DateTimeFormatter > formatterList = List.of (
                DateTimeFormatter.ISO_LOCAL_DATE ,
                DateTimeFormatter.ofPattern ( "dd.MM.uuuu" ) ,
                DateTimeFormatter.BASIC_ISO_DATE ,
                DateTimeFormatter.ofPattern ( "uuuu/M/dd" ) ,
                DateTimeFormatter.ofPattern ( "dd/MM/uuuu" )
        );

        final List < String > inputs = List.of ( "2020-01-23" , "23.01.2020" , "20200123" , "2020/01/23" , "23/01/2020" );

        for ( String input : inputs )
        {
            LocalDate localDate = null;
            for ( DateTimeFormatter formatter : formatterList )
            {
                try
                {
                    localDate = LocalDate.parse ( input , formatter );
                    if ( ! localDate.equals ( LocalDate.of ( 2020 , Month.JANUARY , 23 ) ) )
                    {
                        throw new IllegalStateException ( "Oops! Unexpected result. " + input + " ➙ " + localDate );
                    }
                    System.out.println ( input + " ➙ " + localDate );
                    break; // Bail out of this inner FOR loop, as we have successfully parsed this input.
                } catch ( DateTimeParseException e )
                {
                    // Swallow exception, as we expect most to fail.
                }
            }
            Objects.requireNonNull ( localDate , "Oops, unexpected input: " + input );
        }
    }
}

См. Этот код, запущенный в режиме реального времени на IdeOne.com .

2020-01-23 ➙ 2020-01-23

23.01.2020 ➙ 2020-01-23

20200123 ➙ 2020-01-23

2020/01/23 ➙ 2020-01-23

23/01 /2020 ➙ 2020-01-23

...