猿问

我想编写一段代码来使用 java 验证不同类型的日期,但带有 T 和 Z 的日期仍然显示无效

这是我写的代码


如果有人尝试过类似的事情,请建议我。


private static final String[] Date_Reg_Ex = {

        "yyyy-MM", "yyyy-MM-dd", "dd-MMMM-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "dd-MM-yyyy HH:mm:ss/SSS",

        "yyyy-MM-dd HH:mm", "yyyy-mm-dd'T'HH:MM:ss", "yyyy-MM-dd'T'HH:mm:ss.SSS",

        "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd'@'HH:mm:ss",

        "yyyy-MM-dd'/'K:mm a", "MM-dd-yyyy hh:mm a", "MM-dd-yyyy hh:mm:ss a", "hh:mm:ss MMM d, yyyy z",

        "EEEE dd/MM/yyyy", "EEE, dd MMM yyyy HH:mm:ss zzz", "EEE MMM dd hh:mm:ss z yyyy", "dd MMMMM yyyy",

        "MM/dd/yyyy HH:mm", "MM/YYYY", "MM/YY", "dd/MM/yyyy", "yyyy/MM/dd", "MMM, dd/yyyy", "dd.MM.yyyy", "MMM. dd",

        "yyyy", "yyyyMMdd", "MMddyyyy", "MMMM yyyy", "ddMMyyyyHHmmss", "yyyy"

};


public static boolean isValidDate(String value, TimeZone timeZone) {

    DateValidator dateValidator = DateValidator.getInstance();

    for (String dateRegEx : Date_Reg_Ex) {

        if (dateValidator.isValid(value, dateRegEx)) {

            return true;

        }

    }

    return false;

}


幕布斯7119047
浏览 186回答 4
4回答

RISEBY

我为此使用了SimpleDateFormat而不是任何外部库,您可以通过简单地解析日期并检查异常来验证日期 -我想你可以使用这样的东西 -private static final String[] DATEFORMATS = {"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'","yyyy-MM-dd'T'HH:mm:ss'Z'",        "dd-MM-yy HH:mm:ss","dd-MMM-yy HH:mm:ss","yyyy-MM-dd","yyyy-MMM-dd","dd-MMM-yyyy","dd-MM-yyyy"};public static Date parseDate(String date ) {    SimpleDateFormat sdf = new SimpleDateFormat();    Date parsedDate = null;    for(String format : DATEFORMATS) {        try {            sdf.applyPattern(format);            parsedDate = sdf.parse(date);            break;        }catch(ParseException e) {            LOG.debug("parseDate:: Not in format::{} Moving to next ",format);        }    }    return parsedDate;}

手掌心

既然您写了“带有 T 和 Z 的日期仍然显示无效”,我想您的意思是:“yyyy-mm-dd'T'HH:MM:ss”“yyyy-MM-dd'T'HH:mm:ss.SSS”和“时:分:秒 MMM d, yyyy z”“EEE,dd MMM yyyy HH:mm:ss zzz”“EEE MMM dd hh:mm:ss z yyyy”我找不到 2、3、4 和 5 的任何问题。然而,日期 1 切换了月份和分钟,我猜这不是有意的。以下是对我有用的日期示例:“yyyy- MM -dd'T'HH: mm :ss”->“2019-09-12T13:21:31”“yyyy-MM-dd'T'HH:mm:ss.SSS”->“2019-09-12T13:21:31.020”“hh:mm:ss MMM d, yyyy z”->“太平洋标准时间 2019 年 9 月 12 日 1:21:31”“EEE,dd MMM yyyy HH:mm:ss zzz”->“2019 年 9 月 12 日星期四 13:21:31 PST”“EEE MMM dd hh:mm:ss z yyyy”->“2019 年 9 月 12 日星期四 1:21:31 PST”

慕莱坞森

它可能与您的本地有关,我测试了 @Aio 的一些示例,并且必须强制特定的默认本地才能使其成功,我还将他的更改应用于第 8 个模式:我使用了 Apache Commons Validator 1.6 版本private static final String[] Date_Reg_Ex = {        "yyyy-MM", "yyyy-MM-dd", "dd-MMMM-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "dd-MM-yyyy HH:mm:ss/SSS",        "yyyy-MM-dd HH:mm", "yyyy-MM-dd'T'HH:mm:ss" /** This has been updated as suggested by Aio **/, "yyyy-MM-dd'T'HH:mm:ss.SSS",        "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd'@'HH:mm:ss",        "yyyy-MM-dd'/'K:mm a", "MM-dd-yyyy hh:mm a", "MM-dd-yyyy hh:mm:ss a", "hh:mm:ss MMM d, yyyy z",        "EEEE dd/MM/yyyy", "EEE, dd MMM yyyy HH:mm:ss zzz", "EEE MMM dd hh:mm:ss z yyyy", "dd MMMMM yyyy",        "MM/dd/yyyy HH:mm", "MM/YYYY", "MM/YY", "dd/MM/yyyy", "yyyy/MM/dd", "MMM, dd/yyyy", "dd.MM.yyyy", "MMM. dd",        "yyyy", "yyyyMMdd", "MMddyyyy", "MMMM yyyy", "ddMMyyyyHHmmss", "yyyy"};public static boolean isValidDate(String value, TimeZone timeZone) {    DateValidator dateValidator = DateValidator.getInstance();    for (String dateRegEx : Date_Reg_Ex) {        if (dateValidator.isValid(value, dateRegEx)) {            return true;        }    }    return false;}public static void main(String... args) {    // without the next line some tests fail    Locale.setDefault(Locale.US);    assertTrue("2019-09-12T13:21:31");    assertTrue("2019-09-12T13:21:31.020");    assertTrue("1:21:31 Sep 12, 2019 PST");    assertTrue("Thursday, 12 Sep 2019 13:21:31 PST");    assertTrue("Thursday Sep 12 1:21:31 PST 2019");}private static void assertTrue(String s) {    if (!isValidDate(s, null)) {        System.err.println("Not valid: " + s);    } else {        System.out.println("Valid: " + s);    }}这给了我:Valid: 2019-09-12T13:21:31Valid: 2019-09-12T13:21:31.020Valid: 1:21:31 Sep 12, 2019 PSTValid: Thursday, 12 Sep 2019 13:21:31 PSTValid: Thursday Sep 12 1:21:31 PST 2019Process finished with exit code 0

肥皂起泡泡

我认为 yyyy-mm-dd'T'HH:MM:ss 有拼写错误。mm 代表分钟,MM 代表月份,这里应该是 yyyy-MM-dd'T'HH:mm:ss。请尝试更正一次,我希望您无需任何程序/额外代码即可获得所需的结果。
随时随地看视频慕课网APP

相关分类

Java
我要回答