当前位置: 首页 > 知识库问答 >
问题:

如何使用时间API检查字符串是否匹配日期模式?

颛孙霖
2023-03-14

我的程序正在将输入字符串解析localdate对象。在大多数情况下,字符串看起来像30.03.2014,但偶尔看起来像3/30/2014。根据具体情况,我需要使用不同的模式来调用DateTimeFormatter.ofPattern(String pattern)。基本上,在进行解析之前,我需要检查字符串是否匹配模式dd.mm.yyyym/dd/yyyy

regex方法类似于:

LocalDate date;
if (dateString.matches("^\\d?\\d/\\d{2}/\\d{4}$")) {
  date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("M/dd/yyyy"));  
} else {
  date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("dd.MM.yyyy"));  
}

这是有效的,但是在匹配字符串时使用日期模式字符串也是很好的。

共有1个答案

文鸣
2023-03-14

好吧,我继续把它作为答案张贴出来。一种方法是创建将保存模式的类。

public class Test {
    public static void main(String[] args){
        MyFormatter format = new MyFormatter("dd.MM.yyyy", "M/dd/yyyy");
        LocalDate  date = format.parse("3/30/2014"); //2014-03-30
        LocalDate  date2 = format.parse("30.03.2014"); //2014-03-30
    }
}

class MyFormatter {
    private final String[] patterns;

    public MyFormatter(String... patterns){
        this.patterns = patterns;
    }

    public LocalDate parse(String text){
        for(int i = 0; i < patterns.length; i++){
            try{
                return LocalDate.parse(text, DateTimeFormatter.ofPattern(patterns[i]));
            }catch(DateTimeParseException excep){}
        }
        throw new IllegalArgumentException("Not able to parse the date for all patterns given");
    }
}

您可以像@Menohochschild那样改进这一点,直接从传入构造函数的String数组中创建DateTimeFormatter数组。

另一种方法是使用DateTimeFormatterBuilder,附加所需的格式。可能存在一些其他的方法来完成它,我没有深入阅读文档:-)

DateTimeFormatter dfs = new DateTimeFormatterBuilder()
                           .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd"))                                                                 
                           .appendOptional(DateTimeFormatter.ofPattern("dd.MM.yyyy"))                                                                                     
                           .toFormatter();
LocalDate d = LocalDate.parse("2014-05-14", dfs); //2014-05-14
LocalDate d2 = LocalDate.parse("14.05.2014", dfs); //2014-05-14
 类似资料:
  • 如何检查字符串是否与此模式匹配? 大写字母,数字,大写字母,数字。。。 例如,这些将匹配: 这些不会(“^”表示问题)

  • 问题内容: 我有像 如何检查字符串是否为日期? 使用正则表达式检查String是否为数字 问题答案: 其他人也是正确的 这是你的答案

  • 问题内容: 检查值是否为有效日期(允许使用任何已知的日期格式)的简便方法是什么。 比如我有值,,它都应该被视为日期值,和值,,,不应被视为一个日期值。如果可能的话,最简单的检查方法是什么?因为时间戳也将被允许。 问题答案: 作为此副本的副本而被关闭,因此我认为在此处添加一些新信息很重要。我之所以写它,是因为我害怕人们会真正复制并粘贴此处发布的一些代码并在生产中使用它。 此处的大多数答案都使用一些仅

  • 问题内容: 是否有任何函数可以像MSSQL中那样返回给定字符串是否为日期? 问题答案: 您可以创建一个函数: 然后,您可以像这样使用它:

  • 问题内容: 我想检查一个字符串是否匹配以下格式: 字符串中不应有空格,破折号前仅2个数字,破折号后2个数字。 最好的方法是什么? 问题答案: 您可以使用: 如果您将要进行大量此类验证,请考虑预编译正则表达式: 然后,您可以使用。有关更多详细信息,请参见课程。

  • 字符串格式应如下所示。它是一个逗号分隔的,应该有两个键access_token和client,每个键都应该有它的值,后面跟一个=(格式如下)。 如何编写一个高效的代码来检查给定的字符串是否与下面的模式匹配。 access_token=,client=