java数据格式并非在所有情况下都有效

7gyucuyw  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(306)

我在下面的代码中犯了什么错误?如果我们不传递像yyyy-mm-dd这样的日期格式,它应该抛出解析错误,并且应该返回false,但低于一个不起作用的场景
2020-08-19-->工作正常,回归正轨
2020-19-08-->这工作正常,返回false
20-08-19-->这应该返回false。它不起作用,而且正在恢复
我不明白为什么第三个场景失败了。
澄清:我在问:如果我们通过输入: 20-19-08 ,它应该返回false,对吗?但它又回到了现实。我的问题是,如果我通过20而不是2020,它应该返回false。

代码

public static boolean validateDateFormat(String strDate) {
        SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-MM-dd");
        sdfrmt.setLenient(false);
        try {
            sdfrmt.parse(strDate);
        }
        catch (ParseException e) {
            return false;
        }
        return true;
    }
atmip9wb

atmip9wb1#

20-19-08不遵循格式,因为年份未指定为四位数(尽管您使用的格式设置程序将20和2020都识别为有效年份,只是不是同一年),并且根据格式字符串的月份值将显示为19,这是无效的。

eaf3rand

eaf3rand2#

java.time文件

我不认为 SimpleDateFormat 能够给你所要求的验证。这是一样的,因为这个类是出了名的麻烦和过时。反正你也不该用。我建议您在所有的日期工作中使用java.time,即现代的java日期和时间api。它很好地验证了你的日期字符串。使用 DateTimeFormatter.ISO_LOCAL_DATE .

public static boolean validateDateFormat(String strDate) {
    try {
        DateTimeFormatter.ISO_LOCAL_DATE.parse(strDate);
    }
    catch (DateTimeParseException e) {
        return false;
    }
    return true;
}

试一试:

String candidate = "20-08-19";
    boolean valid = validateDateFormat(candidate);
    System.out.format("Is %s valid? %s%n", candidate, valid);

输出为:

Is 20-08-19 valid? false

我们也可以尝试其他字符串:

Is 2020-13-19 valid? false
Is 2020-08-19 and some more text that should not be here valid? false

一个有效的:

Is 2020-08-19 valid? true

为什么你的代码不起作用?

我不明白为什么第二个场景失败了有人能帮我吗
这就是路 SimpleDateFormat 解析数字。根据文件:
年份:如果格式化程序 Calendar 如果是公历,则应用以下规则。

对于解析,如果模式字母的数目大于2,则不管数字的数目是多少,年份都按字面解释。所以使用“mm/dd/yyyy”,“01/11/12”模式可以解析为公元12年1月11日。

我认为这个例子很符合你的情况。即使你使用 yyyy 在格式模式字符串中, SimpleDateFormat 很乐意解析 20 这将解释为什么没有抛出异常,这反过来又会导致方法返回true。

链接

oracle教程:date time解释如何使用java.time。

vwhgwdsa

vwhgwdsa3#

您没有在catch块中抛出异常。因此它不会抛出任何简单的retyurn false。要获取实际的异常,请抛出它或printstacktrace()抛出它。
这种方法应适用于以下两种情况:

import java.util.*;
import java.text.SimpleDateFormat;

public class Main{
    public static void main(String[] args) {

        String ss = "20-19-08";
        if(validateDateFormat(ss)){
            System.out.println("SUCCESS");
        }else {
            System.out.println("ERROR");
        }

    }

    public static boolean validateDateFormat(String strDate) {
        SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-dd-MM");
        sdfrmt.setLenient(false);
        try {
            Date date = sdfrmt.parse(strDate);
            System.out.println("Formatted Date :: "+date);
            return true;
        }
        catch (Exception e) {
            return false;
        }
    }
}

测试结果:

Input : 20-19-08
Output : 

Formatted Date :: Mon Aug 19 00:00:00 UTC 20
SUCCESS

Input : 2020-19-08
Output :

Formatted Date :: Wed Aug 19 00:00:00 UTC 2020
SUCCESS

相关问题