Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:检查当前字符串的日期格式是否符合要求的格式_Java_Date - Fatal编程技术网

Java:检查当前字符串的日期格式是否符合要求的格式

Java:检查当前字符串的日期格式是否符合要求的格式,java,date,Java,Date,我想知道Java中是否有任何方法可以做到这一点。否则我可能会选择正则表达式解决方案。 我有来自用户的输入字符串,可以是任何字符。我想检查输入字符串是否符合我要求的日期格式。 由于我输入了20130925,并且我需要的格式是dd/MM/yyyy,因此,对于这种情况,我应该得到false。 我不想转换这个日期,我只想检查输入字符串是否符合所需的日期格式 我试过跟随 Date date = null; try { date = new SimpleDateFormat("dd/MM/yyyy")

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

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

由于我输入了20130925,并且我需要的格式是dd/MM/yyyy,因此,对于这种情况,我应该得到false

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



我试过跟随

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

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

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

boolean checkFormat;

if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})"))
    checkFormat=true;
else
   checkFormat=false;
要了解更大的范围,或者想要灵活的解决方案,请参阅答案

编辑 在发布这个答案将近5年后,我意识到这是一种验证日期格式的愚蠢方法。但我把这个放在这里是为了告诉人们,使用regex验证日期是不可接受的

免责声明 以未知格式将字符串解析回日期/时间值本质上是不可能的(让我们面对它,
3/3/3
实际上意味着什么?!),我们所能做的就是“尽最大努力”

重要的 此解决方案不会抛出
异常
,它返回一个
布尔值
,这是经过设计的。任何
异常
s纯粹用作保护机制

2018 因为现在是2018年,Java 8+有日期/时间API(其余都有)。解决方案基本上保持不变,但变得稍微复杂一些,因为我们需要检查:

  • 日期和时间
  • 仅日期
  • 只有时间
这让它看起来像

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;
}
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)
这使得以下

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
原始答案 简单地尝试使用类似于
SimpleDateFormat

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
}
然后,您可以编写一个简单的方法来执行此操作,并在
Date
不为null时返回
true

作为建议

更新了运行示例

我不知道你在做什么,但是,下面的例子

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;
    }

}
输出(类似于)

不对。对于iValidFormat(“yyyy-MM-dd”,“2017-18-15”);不抛出任何异常


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

 public Date validateDateFormat(String dateToValdate) {

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HHmmss");
    //To make strict date format validation
    formatter.setLenient(false);
    Date parsedDate = null;
    try {
        parsedDate = formatter.parse(dateToValdate);
        System.out.println("++validated DATE TIME ++"+formatter.format(parsedDate));

    } catch (ParseException e) {
        //Handle exception
    }
    return parsedDate;
}
setLenient(false)将强制严格匹配

如果您使用的是Joda时间-

private boolean isValidDate(String dateOfBirth) {
        boolean valid = true;
        try {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
            DateTime dob = formatter.parseDateTime(dateOfBirth);
        } catch (Exception e) {
            valid = false;
        }
        return valid;
    }

我相信正则表达式和SimpleDataFormat的组合是正确的答案。如果单个组件无效,SimpleDataFormat不会捕获异常, 定义的格式:yyyy-mm-dd 输入:201-0-12 不会引发任何异常。本应已处理此情况。
但是使用Sok Pomaranczowy建议的正则表达式,Baby将处理这个特殊情况。

这里有一个简单的方法:

public static boolean checkDatePattern(String padrao, String data) {
    try {
        SimpleDateFormat format = new SimpleDateFormat(padrao, LocaleUtils.DEFAULT_LOCALE);
        format.parse(data);
        return true;
    } catch (ParseException e) {
        return false;
    }
}

Regex可用于此目的,并提供一些详细的验证信息,例如,此代码可用于验证(DD/MM/yyyy)格式的任何日期,以及正确的日期和月值以及(1950-2050)之间的年份


例如,如果希望日期格式为“03.11.2017”


我以前尝试过,但我无法理解catch块无论如何都无法捕获该异常。在您的回答和同一问题之后,我再次尝试了。我有意以mm/dd/yyyy格式传递日期,但它没有出现在catch块中。try{date=new SimpleDateFormat(“dd/mm/yyyy”).parse(sDOB);}catch(ParseException e){System.out.println(e.toString());}@mnicky好的,因此,格式化生成的
日期
(使用相同的模式),并对照原始数据进行检查。它胜过使用正则表达式,正则表达式可以“验证”失效日期:P@TylerHoppe实际上,有一个内部测试,它将结果的
日期
,格式与提供的
格式
,并检查结果是否与原始
匹配,在您的情况下,这将返回
,表示格式与提供的值不匹配。我甚至尝试过使用前导字符和尾随字符,但它仍然返回
false
(正如我所期望的那样)@D.B。因为它将允许不匹配格式的日期像TylerHoppe尝试的那样传递为true,但我没有看到,作为原始问题,问题是将日期匹配到特定格式,因此,这是一个严格的匹配。如果你能解释一下这是如何解决问题的,那就太好了。@MarkusWMahlberg Done。这是一个很好的方法!其他方法都是老派的…@Clemzd,除了你可以做一些像'99/99/9999'的事情,这显然是无效的;PI需要正则表达式来满足两种格式,如2015-9-18和2015-09-18 2016年9月12日、2015年8月3日和10月6日怎么样?不行!这可能是最天才的解决方案&如果我们进一步开发它,所有API都支持它,比如添加
String[]t=value.split(“/”;返回值(整数.valueOf(t[0])这对我来说很有效。非常简单。谢谢!仅供参考,非常麻烦的旧日期时间类,如和
java.text.simpleDataFormat
,现在被java 8和更高版本中内置的类所取代。请参阅。它对我有效。唯一完美的解决方案。您的示例代码现在已经过时。那些麻烦的旧日期时间类现在已经过时了由java.time类取代。
private boolean isValidDate(String dateOfBirth) {
        boolean valid = true;
        try {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
            DateTime dob = formatter.parseDateTime(dateOfBirth);
        } catch (Exception e) {
            valid = false;
        }
        return valid;
    }
public static boolean checkDatePattern(String padrao, String data) {
    try {
        SimpleDateFormat format = new SimpleDateFormat(padrao, LocaleUtils.DEFAULT_LOCALE);
        format.parse(data);
        return true;
    } catch (ParseException e) {
        return false;
    }
}
    public Boolean checkDateformat(String dateToCheck){   
        String rex="([0]{1}[1-9]{1}|[1-2]{1}[0-9]{1}|[3]{1}[0-1]{1})+
        \/([0]{1}[1-9]{1}|[1]{1}[0-2]{2})+
        \/([1]{1}[9]{1}[5-9]{1}[0-9]{1}|[2]{1}[0]{1}([0-4]{1}+
        [0-9]{1}|[5]{1}[0]{1}))";

        return(dateToCheck.matches(rex));
    }
 if (String.valueOf(DateEdit.getText()).matches("([1-9]{1}|[0]{1}[1-9]{1}|[1]{1}[0-9]{1}|[2]{1}[0-9]{1}|[3]{1}[0-1]{1})" +
           "([.]{1})" +
           "([0]{1}[1-9]{1}|[1]{1}[0-2]{1}|[1-9]{1})" +
           "([.]{1})" +
           "([20]{2}[0-9]{2})"))
           checkFormat=true;
 else
           checkFormat=false;

 if (!checkFormat) {
 Toast.makeText(getApplicationContext(), "incorrect date format! Ex.23.06.2016", Toast.LENGTH_SHORT).show();
                }