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_Datetime_Java 8_Java Time - Fatal编程技术网

Java 如何检查日期对象或日历对象是否为有效日期(实际日期)?

Java 如何检查日期对象或日历对象是否为有效日期(实际日期)?,java,date,datetime,java-8,java-time,Java,Date,Datetime,Java 8,Java Time,SimpleDataFormat类的方法: public void setLenient(boolean lenient) 指定是否放宽日期/时间分析。通过宽松的解析,解析器可以使用启发式来解释与该对象格式不完全匹配的输入。通过严格解析,输入必须与此对象的格式匹配 或日历类的方法: public void setLenient(boolean lenient) 指定日期/时间解释是否宽松。在宽大的解释下,“1996年2月942日”等日期将被视为等同于1996年2月1日后的第941天。在严格(

SimpleDataFormat
类的方法:

public void setLenient(boolean lenient)
指定是否放宽日期/时间分析。通过宽松的解析,解析器可以使用启发式来解释与该对象格式不完全匹配的输入。通过严格解析,输入必须与此对象的格式匹配

日历
类的方法:

public void setLenient(boolean lenient)
指定日期/时间解释是否宽松。在宽大的解释下,“1996年2月942日”等日期将被视为等同于1996年2月1日后的第941天。在严格(不宽容)的解释下,此类日期将导致抛出异常。默认为宽松

检查格式的一致性或日期

我想确认带有
MM-DD-YYYY
(2016年2月31日)的日期是否应返回无效,因为2月31日不是真实日期,因此1980年4月31日也应返回无效


不希望使用Java 8中的Joda time API,但是如果您对此有任何建议,我们将不胜感激。

使用Java time API,可以使用
解析器样式来完成此操作:

样式严格解析日期和时间

使用严格解析将确保所有解析的值都在字段有效值的外部范围内。个别字段可进一步处理以确保严格性

例如,使用严格模式解析ISO日历系统中的年-月和月-日将确保月-日对年-月有效,拒绝无效值

此代码将抛出一个
DateTimeParseException
,因为它不是有效的日期

默认情况下,格式化程序具有
ResolverStyle

默认情况下,格式化程序具有智能解析器样式


但您可以通过调用formatter实例来更改此设置。

getActualMaximum和getActualMinimum可能在Calendar类中有所帮助。为了纠正一个误解:Joda Time不在Java-8中,而是一个独立且非常不同的库。新的java.time包仅受Joda time的启发,是从头开始实现的API@Shekar163在Java 8之前,你必须要么依靠日历,要么使用JoDaTime。确实尝试了日历,但是它不像JoDA时间那么精确,但是我有一个限制不能使用JoDA时间。如果除了JoDA时间API或Java8之外没有其他解决方案,我将被迫使用Java8WELL。升级到java8;)你明白吗?我已经尝试过你建议的解决方案了,谢谢,但这不是我想要的for@Shekar163答案是可以的,因为将模式修改为“MM-dd-yyyy”将为您的输入“02-31-2016”产生假结果(与您的另一个示例“04-31-1980”相同)。所以我不明白你真正的问题是什么。还是你的模式错了???我希望您没有使用“MM-DD-YYYY”@Meno我正在寻找上述java7中的joda Time API替代品或Java8 API替代品解决方案是可以的,但不是我要寻找的,我希望你好好考虑一下,如果解决方案真的那么好,让joda Time API或Java8嵌入joda Time有什么意义吗?@Shekar163如我在其他评论中所说,Java-8不包含Joda时间。尽管使用了一些相同的类名,但这两个库都非常不同。但是,您可能正在寻找Java-8版本6或7平台的新时间库的后端口。这样做,您可以应用与Java-8中相同的代码(在更改了导入语句之后),只有少数例外。
final static String DATE_FORMAT = "dd-MM-yyyy";

public static boolean isDateValid(String date) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
}
final static String DATE_FORMAT = "dd-MM-yyyy";

public static boolean isDateValid(String date) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
}