【问题标题】:how to check if one date is after another in java?如何在java中检查一个日期是否是一个接一个?
【发布时间】:2014-04-20 21:17:24
【问题描述】:

我将两个日期作为命令行参数,并想检查第一个日期是否在第二个日期之后。日期格式为“dd/MM/yyy”。 示例:java dateCheck 01/01/2014 15/03/2014 我还需要检查硬编码到程序中的第三个日期是否在第二个日期之前。

【问题讨论】:

  • 到目前为止,您有任何代码可以显示您的尝试吗?
  • Date 的 javadoc 会告诉你 1. 它实现了 Comparable 和 2. 它有 .before().after() 方法
  • Compare dates in Java 的可能重复项
  • 您的意思是使用四个“y”字符吗?那么,“dd/MM/yyyy”而不是“dd/MM/yyy”?

标签: java date command-line-arguments


【解决方案1】:
try {
    System.out.println("Enter first date : (dd/MM/yyyy)");
    BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date date1 = sdf.parse(bufferRead.readLine());
    System.out.println("Enter second date : (dd/MM/yyyy)");
    Date date2 = sdf.parse(bufferRead.readLine());
    System.out.println(date1 + "\n" + date2);
    if (date1.after(date2)) {
        System.out.println("Date1 is after Date2");
    } else {
            System.out.println("Date2 is after Date1");
    }
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    比较两个日期:

                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");
    
                Date firstDate = sdf.parse("01/01/2014");
                Date secondDate = sdf.parse("15/03/2014");
    
                if(firstDate.before(secondDate)){
                    System.out.println("firstDate <  secondDate");
                }
                else if(firstDate.after(secondDate)){
                    System.out.println("firstDate >  secondDate");
                }
                else if(firstDate.equals(secondDate)){
                    System.out.println("firstDate = secondDate");
                }
    

    【讨论】:

      【解决方案3】:

      tl;博士

      LocalDate ld1 = LocalDate.parse( "01/01/2014" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ;
      LocalDate ld2 = LocalDate.parse( "15/03/2014" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ;
      LocalDate ld3 = LocalDate.of( 2014 , Month.JULY , 1 ) ;
      
      Boolean isFirstDateBeforeSecondDate = ld1.isBefore( ld2 ) ;
      Boolean isThirdDateBeforeSecondDate = ld3.isBefore( ld2 ) ;
      
      Boolean result = ( isFirstDateBeforeSecondDate && isThirdDateBeforeSecondDate ) ;
      
      return result ;
      

      使用 java.time

      现代方法使用 java.time 类,而不是麻烦的旧旧日期时间类(DateCalendar 等)。

      LocalDate 类表示没有时间和时区的仅日期值。

      使用DateTimeFormatter 类定义格式模式以匹配您的输入字符串。

      String input = "15/03/2014" ;
      DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
      LocalDate ld = LocalDate.parse( input , f );
      

      ld.toString(): 2014-03-15

      要指定固定日期,请传递 yearmonthdayOfMonth。对于月份,您可以指定一个数字,1-12 月的编号为 1-12(与传统课程中疯狂的 0-11 不同!)。或者您可以选择使用Month 枚举对象。

      LocalDate firstOf2014 = LocalDate.of( 2014 , Month.JANUARY , 1 );
      

      使用isBeforeisEqualisAfter 方法进行比较。

      Boolean isInputDateBeforeFixedDate = ld.isBefore( firstOf2014 ) ;
      

      isInputDateBeforeFixedDate.toString(): false

      ISO 8601

      如果可能,请将您的特定日期字符串格式替换为标准 ISO 8601 格式。该标准为日期时间值定义了许多有用的实用明确字符串格式。

      java.time 类在解析/生成字符串时默认使用标准格式。您可以在上面的代码中看到示例。对于仅日期值,标准格式为 YYYY-MM-DD。


      关于java.time

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

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

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

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        【解决方案4】:

        使用 SimpleDateFormat 将字符串转换为日期。

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date date1 = sdf.parse("01/01/2017");
        

        Datebeforeafter 方法,可以是compared to each other 如下:

        if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
            // In between
        }
        

        对于包容性比较:

        if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
            /* historyDate <= todayDate <= futureDate */ 
        }
        

        【讨论】:

        • (a) 您的格式模式不适合您的示例数据。三个 'y' 字符而不是四个字符,以及一个斜杠而不是一个句号。 (b) 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。
        【解决方案5】:

        读取日期并检查之前:

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");
        try {
            Date date1 = sdf.parse(string1);
            Date date2 = sdf.parse(string2);
            if(date1.before(date2)) {
               // do something
            }
        } catch(ParseException e) {
            // the format of the read dates is not the expected one
        }
        

        【讨论】:

          猜你喜欢
          • 2021-02-24
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          • 2013-04-11
          • 1970-01-01
          • 2013-04-01
          • 2019-03-06
          • 2020-03-20
          相关资源
          最近更新 更多