Как я могу преобразовать несколько форматов даты iso с той же функцией на дату в java? - PullRequest
1 голос
/ 09 мая 2020

Я создаю DSL с ANTLR 4, и мне интересно, можно ли преобразовать несколько форматов даты (строку) в дату с той же функцией без передачи формата, например, если мой DSL такой

date1 = "2020-05-08"
date2 = "2020/05/08"
date3 = "20200508"
...

и в моем java коде я конвертирую строку прямо в дату, не зная формата, например

Date date1 = convertToDate(date1);
Date date2 = convertToDate(date2);
Date date1 = convertToDate(date3);

вместо записи

Date date1 = convertToDate(date1,"yyyy-mm-dd");
Date date2 = convertToDate(date2,"yyyy/mm/dd");
Date date1 = convertToDate(date3,"yyyymmdd");

Ответы [ 3 ]

5 голосов
/ 09 мая 2020

Начиная с Java 8, который представил новый API даты и времени , вам больше не рекомендуется использовать Date, Calendar, SimpleDateFormat и т. Д. Теперь это устаревшие типы.

Кроме того, если вы собираетесь анализировать месяц, вы должны использовать MM вместо mm (что означает минуты).

С новым API даты и времени вы можете использовать DateTimeFormatter с необязательными шаблонами , используя [ и ]. Затем вы можете проанализировать даты строки до LocalDate экземпляров, как показано ниже:

DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
        .appendPattern("[yyyy-MM-dd]")
        .appendPattern("[yyyy/MM/dd]")
        .appendPattern("[yyyyMMdd]")
        .toFormatter();

LocalDate date1 = LocalDate.parse("2020-05-08", dateFormatter);
LocalDate date2 = LocalDate.parse("2020/05/08", dateFormatter);
LocalDate date3 = LocalDate.parse("20200508", dateFormatter);

System.out.println(date1);
System.out.println(date2);
System.out.println(date3);
0 голосов
/ 09 мая 2020

В переданном вами примере вы можете удалить все символы, отличные от di git, чтобы использовать только одну функцию преобразования. Пример:

date1 = "2020-05-08"
date2 = "2020/05/08"
date3 = "20200508"
...

dateN = removeSymbols(dateN);

Date date = convertToDate(dateN,"yyyymmdd");

Чтобы удалить non di git, вы можете использовать эту функцию:

dateN = dateN.replaceAll("\\D", "");
0 голосов
/ 09 мая 2020

Вы должны быть в состоянии выполнить sh это с помощью простого регулярного выражения.

Pattern datePattern = Pattern.compile("^(?<Year>\\d{4})[/-]?(?<Month>\\d{2})[/-]?(?<Day>\\d{2})$")

Затем создайте дату с группами совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...