为了账号安全,请及时绑定邮箱和手机立即绑定

让picocli解析本地日期格式

让picocli解析本地日期格式

慕村225694 2023-02-16 15:38:42
PicoCLI 接受2019-04-26作为LocalDate变量的输入,但它不接受像26.04.2019.为此你需要:SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy",Locale.GERMANY);您如何告诉 PicoCLI 使用此格式化程序而不依赖于美国日期输入?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

您可以为特定选项或全局为特定类型的所有选项和位置参数定义自定义类型转换器。


注册自定义转换器最紧凑的方式通常是使用 lambda 表达式:


new CommandLine(new DateFormatDemo())

      .registerConverter(Date.class,

                         s -> new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).parse(s))

      .execute(args);

如果需要为特定选项设置转换器,则需要定义一个类并在@Option(converter = X.class)该选项的注释中指定该类。


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_ Date options

        new CommandLine(new DateFormatDemo())

              .registerConverter(Date.class,

                   s -> new SimpleDateFormat("MMM.dd.yyyy", Locale.ITALIAN).parse(s))

              .execute("-d=31.07.1969", "--default=Gennaio.01.2020");

    }

}

使用无效输入的第一次调用-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=Gennaio.01.2020以确认全局类型转换器现在以我们的自定义意大利语格式处理日期,提供以下输出:


[-d=31.07.1969, --default=Gennaio.01.2020] -> Thu Jul 31 00:00:00 JST 1969; Wed Jan 01 00:00:00 JST 2020



查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信