Java:检查当前字符串的日期格式是否符合所需的格式免責聲明重要2018原始答案编辑

2022-08-31 13:15:19

我想知道Java中是否有任何方法可以做到这一点。否则我可能会选择正则表达式解决方案。

我有来自用户的输入字符串,可以是任何字符。我想检查输入字符串是否符合我所需的日期格式。

由于我有输入20130925,我所需的格式是dd / MM / yyyy,所以在这种情况下,我应该得到

我不想转换这个日期,我只想检查输入字符串是否符合所需的日期格式。



我已尝试以下操作

Date date = null;
try {
date = new SimpleDateFormat("dd/MM/yyyy").parse("20130925");
} catch (Exception ex) {
// do something for invalid dateformat
}

但是我的 catch (Exception ex) 块无法捕获 SimpleDateFormat.Parse() 生成的任何异常;


答案 1

免責聲明

以未知格式解析字符串回到日期/时间值本质上是不可能的(让我们面对现实吧,这到底是什么意思?!),我们所能做的就是“尽最大努力”3/3/3

重要

这个解决方案不会抛出一个,它返回一个,这是设计使然。任何 s 都纯粹用作保护机制。ExceptionbooleanException

2018

由于现在是2018年,Java 8 +具有日期/时间API(其余的具有ThreeTen向后移植)。解决方案基本保持不变,但变得稍微复杂一些,因为我们需要对以下各项执行检查:

  • 日期和时间
  • 仅日期
  • 只有时间

这使它看起来像...

public static boolean isValidFormat(String format, String value, Locale locale) {
    LocalDateTime ldt = null;
    DateTimeFormatter fomatter = DateTimeFormatter.ofPattern(format, locale);

    try {
        ldt = LocalDateTime.parse(value, fomatter);
        String result = ldt.format(fomatter);
        return result.equals(value);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(value, fomatter);
            String result = ld.format(fomatter);
            return result.equals(value);
        } catch (DateTimeParseException exp) {
            try {
                LocalTime lt = LocalTime.parse(value, fomatter);
                String result = lt.format(fomatter);
                return result.equals(value);
            } catch (DateTimeParseException e2) {
                // Debugging purposes
                //e2.printStackTrace();
            }
        }
    }

    return false;
}

这使得以下...

System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50", Locale.ENGLISH));
System.out.println("isValid - yyyy-MM-dd with 2017-18--15 = " + isValidFormat("yyyy-MM-dd", "2017-18--15", Locale.ENGLISH));

输出。。。

isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
isValid - yyyy-MM-dd with 2017-18--15 = false

原始答案

简单的尝试并使用类似的东西解析为所需的StringDateSimpleDateFormat

Date date = null;
try {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    date = sdf.parse(value);
    if (!value.equals(sdf.format(date))) {
        date = null;
    }
} catch (ParseException ex) {
    ex.printStackTrace();
}
if (date == null) {
    // Invalid date format
} else {
    // Valid date format
}

然后,您可以简单地编写一个简单的方法来执行此操作,并在不为 null 时返回...trueDate

作为建议...

使用运行示例进行更新

我不确定你在做什么,但是,下面的例子...

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDateParser {

    public static void main(String[] args) {
        System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50"));
    }

    public static boolean isValidFormat(String format, String value) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.parse(value);
            if (!value.equals(sdf.format(date))) {
                date = null;
            }
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date != null;
    }

}

输出(类似)...

java.text.ParseException: Unparseable date: "20130925"
isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
    at java.text.DateFormat.parse(DateFormat.java:366)
    at javaapplication373.JavaApplication373.isValidFormat(JavaApplication373.java:28)
    at javaapplication373.JavaApplication373.main(JavaApplication373.java:19)

不正确。对于 isValidFormat(“yyyy-MM-dd”, “2017-18--15”);不引发任何异常。

isValid - yyyy-MM-dd", "2017-18--15 = false

对我来说似乎按预期工作 - 该方法不依赖于(也不会抛出)异常来执行其操作


答案 2

对于您的情况,您可以使用正则表达式:

boolean isValidFormat = input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})");

对于更大的范围或如果你想要一个灵活的解决方案,参考MadProgrammer的答案。

编辑

发布此答案近5年后,我意识到这是验证日期格式的愚蠢方法。但是我只是把这个留在这里,告诉人们使用正则表达式来验证日期是不可接受的。