当前位置: 首页 > 知识库问答 >
问题:

2月29日的SimpleDataFormat解析日期错误[重复]

徐奇
2023-03-14

我装了这个

   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中通过,这是无效的,但它返回正确的结果。

共有1个答案

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

您正在使用多年前被java取代的糟糕的日期时间类。JSR 310中定义的时间类。

默认情况下,java。时间LocalDate类拒绝分析无效的输入。分析异常陷阱。

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

查看此代码在IdeO上实时运行ne.com.

java。Java 8及更高版本内置了时间框架。这些类取代了麻烦的旧遗留日期时间类,如java。util。日期、日历,

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

现在处于维护模式的Joda Time项目建议迁移到java。时间类。

您可以交换java。直接使用数据库创建时间对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql* 类。Hibernate5

从何处获取java。时间课程?

  • Java SE 8、Java SE 9、Java SE 10、Java SE 11及更高版本—标准Java API的一部分,带有捆绑实现。
  • 大部分java。时间功能被向后移植到Java 6
  • Android(26)的更高版本捆绑了java的实现。时间类
 类似资料:
  • 问题内容: 我有一个名为的变量,它具有以下格式的今天的日期:。然后,将其格式化为MySQL的Date类型格式,即。这段代码可以做到: 我要做的是将其恢复为Date类型。我尝试了一些方法,但是它们没有用。主要解决方案是按照其他的问题中所述进行操作](http://codingdict.com/questions/2936),并通过一个小小的mod达到了我想要的功能: 但是它不起作用,因为尝试解析时出

  • 问题内容: 我有字符串格式的日期,我想将其解析为使用日期。 我将其解析为: 但是奇怪的是,如果我传递的是“ 03-08- 201309 hjhkjhk ”或“ 03- 88 -2013”​​或 43 -88-201378,它不会抛出错误,而是对其进行解析。 为此,我必须编写正则表达式模式以检查日期的输入是否正确。但是为什么会这样呢? 代码: 问题答案: 您应该使用: 我不确定是否可以捕获 到 您想

  • 我有一个带有字符串的数组列表,我想在日期中转换它。在下面的代码中,似乎不能使用“parse”来完成此操作: 但那不起作用。 你能帮帮我吗?

  • 嗨,我正在尝试以YYYY-MM-DD格式解析日期。我正在尝试这个: 但是我得到了错误,我想这是一个解析错误, 0001-01-01 00:00:00 0000 UTC解析时间“2016-01-1”为“2020-12-30”:无法将“-01-01”解析为“0” 我该如何解析它,或者通过其他示例给出一些提示?蒂亚。

  • 我有一个需求,当我把日期从一种格式转换成另一种格式时,我可能会得到一个无法解析的日期异常。下面粘贴了该类的代码

  • 问题内容: 我用来格式化字符串中的日期。但是现在它混合了月份和日期。 我有一个包含的字符串。后 它返回: 我希望它会回来 我怎样才能告诉代码格式是? 作为记录,将按预期解析为。 问题答案: 指定: 在日期格式不明确的情况下(例如,当日期为12或更少时),这将优先使用DD-MM-YYYY格式而不是MM-DD- YYYY。该功能在此处记录。