сделать пикокли разбирать локальный формат даты - PullRequest
1 голос
/ 24 июня 2019

picocli принимает 2019-04-26 в качестве входных данных для переменной Localdate, но не принимает немецкий формат даты 26.04.2019.
Для этого вам нужно:

SimpleDateFormat format = new SimpleDateFormat ("dd.MM.yyyy", Locale.GERMANY);

Как вы говорите Picocli использовать этот форматер и не зависеть от ввода даты в США?

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете определить пользовательский тип преобразователя , либо для определенной опции, либо глобально для всех опций и позиционных параметров определенного типа.

Вот пример:

class GermanDateConverter implements ITypeConverter<Date> {
    @Override
    public Date convert(String value) throws Exception {
        return new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).parse(value);
    }
}

Этот пример немного упрощен в том смысле, что он не имеет хорошей обработки ошибок.

Например, если пользователь передает 55.55.55, приведенный выше преобразователь типов с радостью вернет эту дату Fri Aug 24 00:00:00 JST 59.Возможно, вам нужно добавить логику для проверки.Можно сгенерировать исключение из метода ITypeConverter.convert, если введенные пользователем данные неверны.Picocli перехватит это исключение и отобразит сообщение об ошибке для конечного пользователя.

Например:

class StrictGermanDateConverter implements ITypeConverter<Date> {
    @Override
    public Date convert(String value) throws Exception {
        Date result = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).parse(value);
        if (result.getYear() < 0) {
            throw new IllegalArgumentException("year should be after 1900");
        }
        return result;
    }
}

Вот пример, который использует этот более строгий преобразователь для демонстрации:

  • проверка ошибок
  • регистрация глобального преобразователя типов для всех java.util.Date опций
  • неверный ввод приводит к picocli, показывая сообщение об ошибке, сопровождаемое сообщением помощи использования
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.ITypeConverter;
import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.Spec;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

@Command(name = "demo")
public class DateFormatDemo implements Runnable {

    @Option(names = {"-d", "--date"}, description = "Date in German format `dd.MM.yyyy`",
            converter = StrictGermanDateConverter.class, paramLabel = "dd.MM.yyyy")
    Date specialDate;

    @Option(names = {"-x", "--default"}, paramLabel = "yyyy-MM-dd",
            description = "This option uses the default converter")
    Date defaultDate;

    @Spec CommandSpec spec;

    public void run() {
        List<String> args = spec.commandLine().getParseResult().originalArgs();
        System.out.printf("%s -> %s; %s%n", args, specialDate, defaultDate);
    }

    public static void main(String[] args) {

        // invalid input: shows error message and usage help
        new CommandLine(new DateFormatDemo()).execute("-d=55.55.55");

        // alternatively, register a global converter
        // for _all_ options and parameters of type Date
        // (this time we give the program valid input, so no error message)
        new CommandLine(new DateFormatDemo())
                .registerConverter(Date.class, new StrictGermanDateConverter())
                .execute("-d=31.07.1969", "--default=31.07.1969");
    }
}

Первый вызов с неверным вводом -d=55.55.55 печатает следующий вывод:

Invalid value for option '--date': cannot convert '55.55.55' to Date (java.lang.IllegalArgumentException: year should be after 1900)
Usage: demo [-d=dd.MM.yyyy] [-x=yyyy-MM-dd]
  -d, --date=dd.MM.yyyy      Date in German format `dd.MM.yyyy`
  -x, --default=yyyy-MM-dd   This option uses the default converter

Второй вызов, где мы передаем --default=31.07.1969, чтобы подтвердить, что преобразователь глобального типа теперь обрабатывает немецкийформат, дает следующий вывод:

[-d=31.07.1969, --default=31.07.1969] -> Thu Jul 31 00:00:00 JST 1969; Thu Jul 31 00:00:00 JST 1969
...