DateFormat для анализа текущего года / месяца / даты, если они не указаны как часть шаблона - PullRequest
0 голосов
/ 04 июня 2018

Вероятно, я пытаюсь достичь чего-то, что недоступно из коробки от SimpleDateFormat и ограничения относительно того, где год / месяц / дата по умолчанию установлены на 1970 / январь / 01, если yy / mm / ddне определено в шаблоне.

Пример:

String pattern = "hh:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("08:05:05");
System.out.println(date);

Результат: Чт 01 января 08:05:05 IST 1970

У меня есть сценарий, в котором я мог быполучить любой пользовательский шаблон для моего API и должен иметь возможность анализировать текущую дату / месяц / день, если в шаблоне отсутствуют символы соответствующего формата (отсутствует y или m или d)

Желаемый результат для приведенного выше примера (сегодня 4 июня 2018 года): понедельник, июнь 04 08:05:05 IST 2018

Может ли кто-нибудь помочь мне в том, как мне добиться такого поведения?

1 Ответ

0 голосов
/ 04 июня 2018

java.time

public static void parseCustomFormat(String formatPattern, String dateTimeString) {
    LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern(formatPattern)
            .parseDefaulting(ChronoField.YEAR_OF_ERA, today.getYear())
            .parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue())
            .parseDefaulting(ChronoField.DAY_OF_MONTH, today.getDayOfMonth())
            .toFormatter(Locale.ENGLISH);
    LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.format(Locale.ENGLISH, "%-19s -> %s%n",  dateTimeString, parsedDateTime);
}

Приведенный выше метод будет в основном использовать день, месяц и / или год из строки, если шаблон говорит, что должен, и использовать соответствующие значения из сегодняшней даты, если нет.Например:

    parseCustomFormat("HH:mm:ss", "08:05:05");
    parseCustomFormat("yyyy-MM-dd'T'HH:mm:ss", "2015-11-23T21:41:45");
    parseCustomFormat("MM H:mm", "10 20:58");
    parseCustomFormat("yy d H:mm", "34 29 9:30");

Когда я запускал этот код сегодня, вывод был:

08:05:05            -> 2018-06-04T08:05:05
2015-11-23T21:41:45 -> 2015-11-23T21:41:45
10 20:58            -> 2018-10-04T20:58
34 29 9:30          -> 2034-06-29T09:30

Сбой синтаксического анализа может произойти, если шаблон содержит год недели и / или номер неделиu для года или дня недели.Он обязательно потерпит неудачу, если он содержит часы в пределах AM или PM (строчные буквы h, как в примере в вопросе) и не имеет маркера AM / PM.

У нас есть устаревший код, который мыприходится поддерживать из Java1.6 +

Никаких больших проблем.Я запустил приведенный выше код на Java 7 с обратным портом ThreeTen, обратным портом java.time для Java 6 и 7 (см. Ссылку внизу), поэтому он должен работать и на Java 6.Если вам нужен java.util.Date для вашего устаревшего кода (и вы не хотите обновлять его до java.time только сейчас), преобразуйте его следующим образом:

    Instant inst = parsedDateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = DateTimeUtils.toDate(inst);
    System.out.format(Locale.ENGLISH, "%-19s -> %s%n",  dateTimeString, oldfashionedDate);

С этим изменением в вышеприведенном коде выводна моем компьютере было:

08:05:05            -> Mon Jun 04 08:05:05 CEST 2018
2015-11-23T21:41:45 -> Mon Nov 23 21:41:45 CET 2015
10 20:58            -> Thu Oct 04 20:58:00 CEST 2018
34 29 9:30          -> Thu Jun 29 09:30:00 CEST 2034

Ссылки

...