首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使picocli解析本地日期格式

使picocli解析本地日期格式
EN

Stack Overflow用户
提问于 2019-06-24 11:16:57
回答 1查看 1K关注 0票数 1

PicoCLI接受2019-04-26作为LocalDate变量的输入,但它不接受像26.04.2019那样的德语日期格式。

为此,你需要:

代码语言:javascript
复制
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy",Locale.GERMANY);

如何告诉PicoCLI使用此格式化程序而不依赖于美国的日期输入?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 02:17:04

您可以为特定选项定义自定义型变流器,也可以为特定类型的所有选项和位置参数全局定义。

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

代码语言:javascript
复制
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将捕获此异常并向最终用户显示错误消息。

例如:

代码语言:javascript
复制
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显示错误消息,后面跟着使用帮助消息。
代码语言:javascript
复制
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无效的第一次调用输出如下:

代码语言:javascript
复制
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以确认全局类型转换器现在以自定义意大利语格式处理日期,它提供了以下输出:

代码语言:javascript
复制
[-d=31.07.1969, --default=Gennaio.01.2020] -> Thu Jul 31 00:00:00 JST 1969; Wed Jan 01 00:00:00 JST 2020
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56735425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档