【问题标题】:SimpleDateFormat parse in wrong date for 29 February [duplicate]SimpleDateFormat 解析错误的日期为 2 月 29 日 [重复]
【发布时间】:2021-06-19 00:41:03
【问题描述】:

我有这个线

   public static boolean isFirstDayOfMonth(String format, String value) {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = sdf.parse(value);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
    return dayOfMonth == 1;
   }

测试并返回 true:

    boolean actual = CommonUtil.isFirstDayOfMonth("yyyy-MM-dd", "2021-02-29");
    assertTrue(actual);

我发现 SimpleDateFormat 将日期转换为 2021 年 3 月 1 日,虽然 2021 年 2 月不是 29 日。如果我通过 2021-02-30,这是无效的,但它返回正确的结果。

【问题讨论】:

  • 我没有看过你的实际问题,但是,我不会再使用SimpleDateFormat 或任何相关的Date 类,而是使用java.time API 代替
  • 您正在使用 terrible 日期时间类,这些类在几年前被 JSR 310 中定义的 java.time 类所取代。
  • 致电sdf.setLenient(false);
  • 除了使用 java.time 之外,您还应该更好地尊重单一责任原则。创建一种方法来将您的字符串解释为 LocalDate,并创建另一种方法来确定 LocalDate 是否属于一个月的第一天。

标签: java simpledateformat


【解决方案1】:

tl;博士

java.time.LocalDate.parse( "2021-02-29" )
…
catch ( DateTimeParseException e )  // Thrown for invalid inputs

java.time

您正在使用 terrible 日期时间类,这些类在几年前被 JSR 310 中定义的 java.time 类所取代。

默认情况下,java.time.LocalDate 类拒绝解析无效输入。解析异常的陷阱。

    try {
        LocalDate ld = LocalDate.parse( "2021-02-29" ) ;
        System.out.println( ld ) ;
    } catch ( DateTimeParseException e ) {
        // … handle invalid input
        System.out.println( "Faulty input" ) ;
    }

看到这个code run live at IdeOne.com


关于java.time

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

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

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

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

从哪里获取 java.time 类?

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多