如何验证字符串是否为YYYYMMDD格式?

时间:2014-02-23 22:31:25

标签: java string date

我有一个字符串,它以YYYYMMDD -

的形式传递给我的一个方法
public static void verifyInput(String input) {    


}

此处传递的输入将采用此形式“YYYYMMDD”;

如何验证input仅以此格式YYYYMMDD传递的字符串?

我只需要验证它是否为YYYYMMDD这种格式..我不需要以YYYYMMDD格式获取当前日期,然后将其与ss进行比较。

更新: -

我只需要验证字符串输入,看看它们是否采用这种格式YYYYMMDD

意思是,如果有人传递字符串hello,那么它不是YYYYMMDD格式..

如果有人传递此字符串20130130,则会以此YYYYMMDD格式验证此字段。

10 个答案:

答案 0 :(得分:4)

您可以使用SimpleDateFormatDate,这是一个解决方案 -

private static final java.text.SimpleDateFormat sdf = 
    new java.text.SimpleDateFormat("yyyyMMdd");

public static java.util.Date verifyInput(String input) {
  if (input != null) {
    try {
      java.util.Date ret = sdf.parse(input.trim());
      if (sdf.format(ret).equals(input.trim())) {
        return ret;
      }
    } catch (ParseException e) {
      e.printStackTrace();
    }
  }
  return null;
}

public static void main(String[] args) {
  String[] dates = new String[] { "20141031",
      "20130228", "20000229", "20000230" };
  for (String str : dates) {
    System.out.println(verifyInput(str));
  }
}

输出

Fri Oct 31 00:00:00 EDT 2014
Thu Feb 28 00:00:00 EST 2013
Tue Feb 29 00:00:00 EST 2000
null

答案 1 :(得分:2)

try {
    new SimpleDateFormat("yyyyDDmm").parse(input);
    // good format
} catch (ParseException e) {
    // bad format
}

答案 2 :(得分:1)

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期工作。

private static final DateTimeFormatter DATE_PARSER
        = new DateTimeFormatterBuilder().appendPattern("yyyyMMdd")
                .parseDefaulting(ChronoField.ERA, IsoEra.CE.getValue())
                .toFormatter(Locale.ROOT)
                .withResolverStyle(ResolverStyle.STRICT);

/** @throws DateTimeParseException if the input date is invalid */
public static void verifyInput(String input) {    
    LocalDate.parse(input, DATE_PARSER);
}

尝试一下:

    String[] sampleStrings = { "20211231", "00000714",
            "20200229", "20210229", "9990731", "100000714" };
    for (String sample : sampleStrings) {
        try {
            verifyInput(sample);
            System.out.println("Valid:   " + sample);
        } catch (DateTimeParseException dtpe) {
            System.out.println("Invalid: " + sample);
        }
    }

输出:

<块引用>
Valid:   20211231
Invalid: 00000714
Valid:   20200229
Invalid: 20210229
Invalid: 9990731
Invalid: 100000714

我在格式模式中使用 yyyy 以确保年份严格为正数(至少为 0001)。例如,我使用 ResolverStyle.STRICT 来排除非闰年的 2 月 29 日。为了完成这项工作,我需要提供一个时代,否则每一年都会是模棱两可的,Java 将拒绝严格解决它。 CE 是共同的时代,《纪元多米尼》。

在代码中是yyyyMMdd(不是YYYYMMDD

我将 YYYYMMDD 理解为 4 位数的年份、2 位数的月份和 2 位数的月份日期,这是大多数没有任何特殊编程知识的英语用户所理解的方式。在 Java 和其他编程语言中,格式模式字母区分大小写。其中一些是:

<头>
符号 含义和注释
y 时代;从 1
周-年;仅对周数有用
年;在公历和 ISO 8601 中使用的签名年份;允许 0(与 java.time 一起引入,不适用于旧的 SimpleDateFormat
M 月份
分时
d 月份; 0 到 28–31
D 一年中的哪一天; 0 到 365 或 366

答案 3 :(得分:0)

将其传递给SImpleDateFormat对象,格式字符串为yyyyMMdd。

答案 4 :(得分:0)

使用RegExp(Pattern&amp; Matcher):

public static void verifyInput(String input) {    
    Pattern p = Pattern.compile("^\d{4}(1[012]|0[1-9])(3[01]|[12]\d|0[0-9])$");
    Matcher m = p.matcher(input);
    return m.matches();
}

(虽然它会检查有效的月份和日期nubmers,但它不会检查当前月份是否只有28/30天。如果您需要检查它,可以添加。)

答案 5 :(得分:0)

你可以通过..验证它。

boolean validate(String s)
{
     if(s.length()!=8)
     return false;
     try{
          int year=Integer.parseInt(s.substring(0,4));
     }
     catch(Exception e)
     {
          return false;
     }
     try{
          int month=Integer.parseInt(s.substring(4,6));
     }
     catch(Exception e)
     {
          return false;
     }
     try{
          int date=Integer.parseInt(s.substring(6,8));
     }
     catch(Exception e)
     {
          return false;
     }
     if(month>12)
     return false;
     if(date>31)
     return false;
     return true;
 }

答案 6 :(得分:0)

扩展Neuron的答案:

 if (month < 1 || month > 12)
     return false;
 int days = 30;
 if (month == 2) {
     days = 28;
     if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) days = 29;
 }
 else {
     if ((1 << month) & 0x15A2) days = 31;
 }
 if (date < 1 || date > days)
     return false;
 return true;

答案 7 :(得分:0)

你可以这样做:

private boolean validateDateFormat(String input) {
    if(input == null) {
        return false;
    }
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    try {
        Date d = format.parse(input);
        logger.debug(d);
        return true;
    } catch(ParseException e) {
        return false;
    }
}

使用此方法对其进行单元测试:

@Test
public void TestDateValidation() {
    logger.info("\ntestDateValidation()");

    assertEquals(false, validateDateFormat("hello"));
    assertEquals(false, validateDateFormat(null));
    assertEquals(false, validateDateFormat(""));
    assertEquals(false, validateDateFormat("d20140228"));
    assertEquals(false, validateDateFormat("Feb 28, 2014"));

    assertEquals(true, validateDateFormat("20140228"));
    validateDateFormat("20140229");
    validateDateFormat("2014024000");

}

给出了这个输出:

Fri Feb 28 00:00:00 EST 2014
Sat Mar 01 00:00:00 EST 2014
Mon Jan 13 00:00:00 EST 2025

不幸的是,这两个古怪的日期仍然被解析为好像它们是真实日期,但看起来根据您的要求不是问题。

答案 8 :(得分:0)

使用 Apache commons-validator

进行验证
GenericValidator.isDate("20130130", "yyyyMMdd", true)

答案 9 :(得分:-1)

将字符串转换为日期:

SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD");
Date date = sdf.parse(input);