【问题标题】:validate a date format in (mm/yyyy) type in java在java中验证(mm / yyyy)类型的日期格式
【发布时间】:2018-10-14 18:44:01
【问题描述】:

如何验证日期格式 MM/YYYY 为字符串 例子-

09/20 错误

13/5651 错误

3/2104 正确

03/2010 是的

【问题讨论】:

  • 我尝试使用 sampleDateFormat,但它给出 09/20 为真,但我需要将日期作为 4 个数字的完整部分
  • 对,不要用SimpleDateFormat,很难正确,而且类早就过时了。使用来自现代 Java 日期和时间 API java,time 的 YearMonthDateTimeFormatter。另外,我认为您不能强制 SimpleDateFormat 拒绝 2 或 3 位数的年份。
  • 相关:How to sanity check a date in Java。您的搜索引擎将很乐意向您展示更多相关和鼓舞人心的问题和答案。
  • 您可以使用 正则表达式 (RegEx) 和 String#matches() 方法来验证您的特定 日期格式,例如:boolean dateIsValid = dateString.matches("^(0?[1-9]|1[012])\\/[0-9]{4}$");。我不会将此作为答案,因为您已经有很多很棒的答案,但是如果您想对此 RegEx 进行解释,请复制/粘贴表达式 ^(0?[1-9]|1[012]) \\/[0-9]{4}$ 进入 RegEx101.com 并阅读那里的说明。

标签: java string validation date


【解决方案1】:

使用YearMonth 类。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/uuuu" ) ;
YearMonth ym = YearMonth.parse( "3/2018" , f ) ;

陷阱DateTimeParseException 以检测无效输入。


提示:使用标准的ISO 8601 格式将日期时间值交换为文本。年月:YYYY-MM

java.time 类默认使用这些标准格式。

YearMonth.parse( "2018-03" ) 

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    您需要的是自定义方法,因为您对日期的有效性设置了特殊限制。
    以下通过了所有 4 个示例:

    public static boolean validDate(String date) {
        date = date.trim();
        if (date.length() < 6)
            return false;
    
        String[] parts = date.split("/");
        if (parts.length != 2)
            return false;
    
        int month = 0;
        try {
            month = Integer.parseInt(parts[0]);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return false;
        }
        if (month < 1 || month > 12)
            return false;
    
        int year = 0;
        try {
            year = Integer.parseInt(parts[1]);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return false;
        }
        if (year < 1000)
            return false;
    
        return true;
    }
    
    public static void main(String[] args) {
        String s1 = "09/20";
        String s2 = "13/5651";
        String s3 = "3/2104";
        String s4 = "03/2010";
    
        System.out.println(s1 + " " + validDate(s1));
        System.out.println(s2 + " " + validDate(s2));
        System.out.println(s3 + " " + validDate(s3));
        System.out.println(s4 + " " + validDate(s4));
    }
    

    将打印:

    09/20 false
    13/5651 false
    3/2104 true
    03/2010 true
    

    我不确定这部分:

    if (year < 1000)
        return false;
    

    如果你愿意,你可以改变它。

    【讨论】:

    • 感谢您的建议。不过我不同意。询问者的约束没有什么特别之处,因此不需要自定义解决方案。Basil Bourque’s answer 中使用的标准库方法可以很好地处理验证。如果需要,您可以结合使用ym.isBefore(YM_MIN) 和类似的范围检查,最多使用YearMonth
    【解决方案3】:
    public boolean isThisDateValid(String dateToValidate, String dateFromat){
    
        if(dateToValidate == null){
            return false;
        }
    
        SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
        sdf.setLenient(false);
    
        try {
    
            //if not valid, it will throw ParseException
            Date date = sdf.parse(dateToValidate);
            System.out.println(date);
    
        } catch (ParseException e) {
    
            e.printStackTrace();
            return false;
        }
    
        return true;
    }
    

    参考https://www.mkyong.com/java/how-to-check-if-date-is-valid-in-java/

    【讨论】:

    • 感谢您的贡献。请不要教年轻人使用陈旧且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
    猜你喜欢
    • 2022-11-29
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2016-01-26
    • 2015-02-07
    相关资源
    最近更新 更多