使用Java进行日期比较

使用Java进行日期比较,java,date,Java,Date,我有两个约会: toDate(用户以MM/dd/yyyy格式输入) currentDate(通过new Date()获取) 我需要将currentDate与toDate进行比较。只有当toDate等于或大于currentDate时,我才必须显示报告。我该怎么做呢?和 如果hour和minute字段可能不正确!=0,则必须将其设置为0 我不能忘记提到,使用java.util.Date被认为是一种不好的做法,它的大多数方法都被弃用。使用java.util.Calendar或者,如果可能的话。如果您有

我有两个约会:

  • toDate
    (用户以
    MM/dd/yyyy
    格式输入)
  • currentDate
    (通过
    new Date()
    获取)
  • 我需要将
    currentDate
    toDate
    进行比较。只有当
    toDate
    等于或大于
    currentDate
    时,我才必须显示报告。我该怎么做呢?

    如果
    hour
    minute
    字段可能不正确!=0,则必须将其设置为0


    我不能忘记提到,使用
    java.util.Date
    被认为是一种不好的做法,它的大多数方法都被弃用。使用
    java.util.Calendar
    或者,如果可能的话。

    如果您有大量与日期相关的处理,请使用
    java.util.Calendar


    日期有
    before()
    after()
    方法。您也可以使用它们。

    您可能正在寻找:

    !toDate.before(currentDate)
    

    before()和after()测试日期是严格在之前还是之后。因此,您必须对另一个进行否定,才能获得非严格行为。

    使用
    java.util.Calendar
    比较日期更容易。 以下是您可能会做的:

    Calendar toDate = Calendar.getInstance();
    Calendar nowDate = Calendar.getInstance();
    toDate.set(<set-year>,<set-month>,<set-day>);  
    if(!toDate.before(nowDate)) {
        //display your report
    } else {
        // don't display the report
    }
    
    日历toDate=Calendar.getInstance(); Calendar nowDate=Calendar.getInstance(); toDate.set(,); 如果(!toDate.早于(nowDate)){ //显示您的报告 }否则{ //不显示报告 }
    如果设置使用Java日期而不是JodaTime,请使用a将字符串转换为日期,然后使用.equals:

    我差点忘了:在比较它们之前,您需要将当前日期的小时、分钟、秒和毫秒归零。我用下面的一个物体来做这件事

    import java.text.DateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    // Other code here
        String toDate;
        //toDate = "05/11/2010";
    
        // Value assigned to toDate somewhere in here
    
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
        Calendar currDtCal = Calendar.getInstance();
    
        // Zero out the hour, minute, second, and millisecond
        currDtCal.set(Calendar.HOUR_OF_DAY, 0);
        currDtCal.set(Calendar.MINUTE, 0);
        currDtCal.set(Calendar.SECOND, 0);
        currDtCal.set(Calendar.MILLISECOND, 0);
    
        Date currDt = currDtCal.getTime();
    
        Date toDt;
        try {
            toDt = df.parse(toDate);
        } catch (ParseException e) {
            toDt = null;
            // Print some error message back to the user
        }
    
        if (currDt.equals(toDt)) {
            // They're the same date
        }
    

    这是一种方式:

    String toDate = "05/11/2010";
    
    if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime() / (1000 * 60 * 60 * 24) >= System.currentTimeMillis() / (1000 * 60 * 60 * 24)) {
        System.out.println("Display report.");
    } else {
        System.out.println("Don't display report.");
    }
    
    更容易理解的是:

    String toDateAsString = "05/11/2010";
    Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString);
    long toDateAsTimestamp = toDate.getTime();
    long currentTimestamp = System.currentTimeMillis();
    long getRidOfTime = 1000 * 60 * 60 * 24;
    long toDateAsTimestampWithoutTime = toDateAsTimestamp / getRidOfTime;
    long currentTimestampWithoutTime = currentTimestamp / getRidOfTime;
    
    if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) {
        System.out.println("Display report.");
    } else {
        System.out.println("Don't display report.");
    }
    
    哦,作为奖励,这是一个变种:

    String toDateAsString = "05/11/2010";
    DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString);
    DateTime now = new DateTime();
    
    if (!toDate.toLocalDate().isBefore(now.toLocalDate())) {
        System.out.println("Display report.");
    } else {
        System.out.println("Don't display report.");
    }
    

    如果出于某种原因,您打算在解决方案中使用
    Date
    对象,则需要执行以下操作:

    
        // Convert user input into year, month, and day integers
        Date toDate = new Date(year - 1900, month - 1, day + 1);
        Date currentDate = new Date();
        boolean runThatReport = toDate.after(currentDate);
    
    toDate
    提前到第二天午夜将解决我在对其他答案的评论中抱怨的bug。但是,请注意,这种方法使用了不推荐使用的构造函数;任何依赖于
    Date
    的方法都会使用一种或另一种不推荐的方法,这取决于您的操作方式,也可能导致比赛条件(例如,如果您将
    toDate
    设置为
    new Date()
    ,然后摆弄年份、月份和日期)。如其他地方所述,使用日历。

    Date
    long getTime()
    返回此日期对象表示的自1970年1月1日00:00:00 GMT以来的毫秒数

    //test if date1 is before date2
    if(date1.getTime() < date2.getTime()) {
    ....
    }
    
    //测试date1是否早于date2
    if(date1.getTime()
    专用布尔值checkDateLimit(){
    long currentDateInMilicond=System.currentTimeMillis();//日期1
    long date1inmilisence=Date1.getTimeInMillis();//Date2
    
    如果(CurrentDateInMilicond)给定该日期等于()将比较毫秒,他将当前日期与MM/dd/yyyy用户输入进行比较,这不是一种有效的方法。他希望进行比较,而不是检查是否相等。是的,谢谢,我在
    方法之后添加了
    。如果他将用户输入的MM/dd/yyyy数据转换为日期对象,该对象上的有效时间不是那天早上0:00吗ing?如果我错了,请纠正我,但在我看来,如果用户输入今天的日期,这种方法将失败。是的,但是equals()是以毫秒为基础的;不是before()和after()基于它吗?如果toDate基于MM/dd/yyyy输入,他还需要手动将时间设置为第二天午夜前一毫秒;否则,如果用户输入今天的日期,这种方法将失败。(不是吗?)问题:您是否需要明确清除超出nowDate的小时/分钟/等字段,或者它们没有设置为toDate表示它们不重要?+1用于使用日历。如果您没有在毫秒级附近进行比较,通常需要清除()创建日历后,请立即调用set方法。@Ophidian感谢clear()的建议我想知道为什么不接受Yet您最初的问题说的很糟糕。我已经改进了它。以后请尽量清晰。不要重复三次和/或不必要的加粗:)如果你考虑使用JDA数据库JoDATME提供比java的日期API更多的帮助,它会使这个和你的其他日期任务变得容易很多。如果我错了请纠正我,但是如果用户输入今天的日期“新数据”,这不会失败吗?将时间设置为无论何时调用,并且基于MM/dd/yyyy的日期对象将有效地设置为当天早上0:00。或者是Date.before()和Date.after(),而不是基于毫秒的方式Date.equals()是吗?没错。实际上,您必须在java.util.Date中使用日历或日期格式化程序来消除时间。修复了其中的一些错误…忘记捕获原始版本中的
    ParseException
    。第一个示例非常适合我的需要:)
    private boolean checkDateLimit() {
    
        long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
        long Date1InMilisecond = Date1.getTimeInMillis(); //Date2
    
        if (CurrentDateInMilisecond <= Date1InMilisecond) {
            return true;
        } else {
            return false;
        }
    
    }