【问题标题】:How to validate a String whether it is in YYYYMMDD format?如何验证字符串是否为 YYYYMMDD 格式?
【发布时间】:2014-03-25 09:30:00
【问题描述】:

我有一个字符串,它以YYYYMMDD 的形式传递给我的方法之一 -

public static void verifyInput(String input) {    


}

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

如何验证input 是否仅以YYYYMMDD 形式传递的字符串?

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

更新:-

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

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

如果有人传递这个字符串20130130,那么它就会得到验证,因为它是这种YYYYMMDD 格式..

【问题讨论】:

  • 通过SimpleDateFormatyyyyMMdd 运行它?
  • input.matches("\\d{8}") 测试输入是否包含 8 位数字。
  • 验证年份和月份是否在界限内很容易,但验证月份中的某天与月份(闰年和年份)一致则困难得多。如果您需要完全验证,则使用日期转换器是有意义的。

标签: java string date


【解决方案1】:

将其传递给格式字符串 yyyyMMdd 的 SIMpleDateFormat 对象。

【讨论】:

    【解决方案2】:

    将字符串转换为日期:

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

    【讨论】:

    • 你可能想学习this document
    • 模式YYYYMMDD 不起作用。您可能希望在我的回答中看到解释。​​
    【解决方案3】:
    try {
        new SimpleDateFormat("yyyyDDmm").parse(input);
        // good format
    } catch (ParseException e) {
        // bad format
    }
    

    【讨论】:

    • +1。足够简单......谢谢B.J......现在有道理......我又遇到了一个问题here。看看你能不能帮我..谢谢你的帮助..
    【解决方案4】:

    使用正则表达式(Pattern & 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();
    }
    

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

    【讨论】:

      【解决方案5】:

      您可以使用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
      

      【讨论】:

      • 谢谢 Elliott.. 现在有道理了.. 我不知道 SimpleDateFormat... 今天学到了一些新东西.... 我又遇到了一个问题 here。看看你能不能帮我..谢谢你的帮助..
      • 您需要为简单的日期格式设置 lenient false (setLenient(false);) 否则有时结果将无效,例如 yyyy-mm-dd 将得到错误日期的解析。
      • 答案是正确的。对于这个问题和/或这个答案的新读者,我建议我们不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter
      【解决方案6】:

      你可以通过..验证它。

      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;
       }
      

      【讨论】:

      • 您还应该检查月份
      【解决方案7】:

      扩展神经元的答案:

       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;
      

      【讨论】:

      • 感谢 Hot Licks 的建议...它与其他方法略有不同,但确实有效.. 我又遇到了一个问题here。看看你能不能帮我。谢谢你的帮助。
      【解决方案8】:

      你可以这样做:

      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
      

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

      【讨论】:

        【解决方案9】:

        验证使用 Apache commons-validator

        GenericValidator.isDate("20130130", "yyyyMMdd", true)
        

        【讨论】:

          【解决方案10】:

          java.time

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

          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 是共同的时代,“Anno Domini”。

          在代码中是yyyyMMdd(不是YYYYMMDD

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

          Symbol Meaning and comment
          y year-of-era; from 1
          Y week-based-year; only useful with a week number
          u year; a signed year as used in the proleptic Gregorian calendar and in ISO 8601; allows 0 (introduced with java.time, did not work with the old SimpleDateFormat)
          M month-of-year
          m minute-of-hour
          d day-of-month; 0 through 28–31
          D day-of-year; 0 through 365 or 366

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-22
            • 2019-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-12
            相关资源
            最近更新 更多