代码之家  ›  专栏  ›  技术社区  ›  Harpreet Singh

无效时显示有效的日期年份值[重复]

  •  -2
  • Harpreet Singh  · 技术社区  · 6 年前

    我正在开发一个日期应用程序,用户将输入日期,我正在验证该日期。日期格式为 dd/MM/yyyy

    import java.util.*;
    import java.text.SimpleDateFormat;
    import java.text.ParseException;
    
    public class HelloWorld {
      public static void main(String[] args) {
     //Scanner sc = new Scanner(System.in);
      String dat = "02/1/2018";
      try {
                 SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                    df.setLenient(false);
                    df.parse(dat);
                    System.out.print("valid");
                } catch (ParseException e) {
                    System.out.print("invalid");
                }
    
       }
     }
    

    这是完美的工作,并验证了我的日期,但当我输入我的日期像 22/02/2-19 这也同样有效。但它应该是无效的,因为我的一年是 2-19 .

    3 回复  |  直到 6 年前
        1
  •  2
  •   Basil Bourque    6 年前

    java.time公司

    java.time公司

    对于仅日期值,请使用仅日期类: LocalDate .

    使用 DateTimeFormatter

    解析时,捕获 DateTimeParseException 以确定是否无效。

    String input = "22/02/2-19";
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
    LocalDate ld = null;
    try {
        ld = LocalDate.parse( input , f );
        System.out.println( "VALID: " + ld.toString() );
    } catch ( DateTimeParseException e ) {
        System.out.println( "INVALID: " + input );
        e.printStackTrace();
    }
    

    java.time.format.DateTimeParseException:无法在索引6处分析文本“22/02/2-19”


    关于 java.time公司

    java.time 框架构建在Java8和更高版本中。这些类取代了麻烦的旧类 legacy 日期时间类,如 java.util.Date , Calendar SimpleDateFormat .

    这个 Joda-Time maintenance mode ,建议迁移到 java.time 上课。

    要了解更多信息,请参阅 Oracle Tutorial . 和搜索堆栈溢出的许多例子和解释。规格是 JSR 310

    你可以交换 直接使用数据库的对象。使用 JDBC driver 符合 JDBC 4.2 或者以后。不需要弦,不需要 java.sql.* 上课。

    在哪里获得java.time类?

    这个 ThreeTen-Extra project使用其他类扩展java.time。这个项目是将来可能添加java.time的一个试验场。你可以在这里找到一些有用的类,比如 Interval , YearWeek , YearQuarter more .

        2
  •  1
  •   D.B.    6 年前

    根据 javadoc 对于 SimpleDateFormat :

    这就是为什么输入 22/02/2-19 不引发解析异常。以2年为一年,忽略其余的。

        3
  •  0
  •   Anonymous    6 年前

    Basil Bourque’s excellent answer 已经给了你最好的解决方案。我不是在重复。如果使用该答案,您希望接受1位数的月份,如第一个示例所示, 02/1/2018 M 在格式模式字符串中。然后两者 1 01 将被接受。同样的 d 2 02

    你的密码出了什么问题

    SimpleDateFormat 从字符串中读取尽可能多的内容以匹配格式模式,但很高兴没有全部读取。举你的第二个例子, 22/02/2-19 ,它解析 22/02/2 变成一个 Date 1月2日星期一00:00:00 CET2(具体结果取决于您的时区),这是2016年前的事了。因为这是一个有效日期,所以不会抛出任何异常。然后忽略字符串的最后三个字符。