如何将集合集合的项目与当前日期进行比较?

时间:2013-08-08 06:35:07

标签: java dataset set hashset

我有以下设置,需要将其日期实例与当前日期进行比较。虽然两个日期相同但比较返回false !!

MyClass.java

import java.util.Date;
public class MyClass {
   private Date date;

   ...

}

我的代码

 ....
 Set <MyClass> myclass = new HashSet();

 I populate it with some data here...

 for(MyClass m : myclass)
 {
   System.err.println("date>>:" + trim(m.getDate()));  //returns 2013-08-08
   System.err.println("date>>:" + trim(getCurrentDate()));  //returns 2013-08-08
   System.err.println("boolean:" +                            
               trim(m.getDate()).equals(trim(getCurrentDate()))); //returns false
 }
}

 public Date getCurrentDate() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    dateFormat.format(date));
    return date;
}

public Date trim(Date date){
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.HOUR, 0);
    return calendar.getTime();
}

5 个答案:

答案 0 :(得分:1)

Date类包括一天到毫秒精度的时间,以及比较相等时的时间。

要仅比较“日期”部分,您可以执行以下操作之一,例如将日期格式化为年 - 月 - 日并比较生成的字符串,或者从日期创建日历对象并比较年,月和一天一个人。另一个选择是确保您比较的日期具有一天中的相同小时,例如12:00,这样您就可以使用equals方法。

答案 1 :(得分:1)

每次致电getCurrentDate,您都可能会收到新的约会。以你的方式格式化它本质上是一个无操作,日期仍然有小时,分钟,秒和毫秒。

所以他们实际上实际上是不同的。

您可以remove this extra information获得所需的行为。

答案 2 :(得分:1)

日期不同,它们可能会以毫秒/秒的差异。 Date equals不依赖于日期格式,而是比较值。下面的代码也会返回false:

Date d1 = new Date();
        SimpleDateFormat f = new SimpleDateFormat("yyyy-mm-dd");
        Date d2 = new Date();
        f.format(d2);
        System.out.println(d1);//e.g. Thu Aug 08 12:09:24 IST 2013
        System.out.println(d2);//e.g. Thu Aug 08 12:09:26 IST 2013
        System.out.println(d1.equals(d2));//false

Date.equals比较时间(Date.getTime()),equals只有在匹配时才会返回true

public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }

每个javadoc:

 The result is true if and only if the argument is not null and is a Date object that represents the same point in time, to the millisecond, as this object. 

Thus, two Date objects are equal if and only if the getTime method returns the same long value for both. 

Date.getTime返回自1970年1月1日00:00:00 GMT后的毫秒数

因此,在您使用trim更新了问题时,请考虑使用毫秒来比较两个long时间值。

如果您需要比较两个不同yyyy-MM-dd个实例的date个值,请考虑使用String.equals代替(黑客方式):

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        String date1 = f.format(new Date());//2013-08-08
        String date2 = f.format(new Date());//2013-08-08
        System.out.println(date1.equals(date2));

答案 3 :(得分:1)

您可以使用GregorianCalendarCalendar#get(..)仅比较年,月和日 来自javadoc

的完美示例
 // get the supported ids for GMT-08:00 (Pacific Standard Time)
 String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
 // if no ids were returned, something is wrong. get out.
 if (ids.length == 0)
     System.exit(0);

  // begin output
 System.out.println("Current Time");

 // create a Pacific Standard Time time zone
 SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);

 // set up rules for Daylight Saving Time
 pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
 pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

 // create a GregorianCalendar with the Pacific Daylight time zone
 // and the current date and time
 Calendar calendar = new GregorianCalendar(pdt);
 Date trialTime = new Date();
 calendar.setTime(trialTime);

 // print out a bunch of interesting things
 System.out.println("ERA: " + calendar.get(Calendar.ERA));
 System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
 System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
 System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
 System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
 System.out.println("DATE: " + calendar.get(Calendar.DATE));
 System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
 System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
 System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
 System.out.println("DAY_OF_WEEK_IN_MONTH: "
                    + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
 System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
 System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
 System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
 System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
 System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
 System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
 System.out.println("ZONE_OFFSET: "
                    + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
 System.out.println("DST_OFFSET: "
                    + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));

答案 4 :(得分:1)

实际上你的方法存在问题..

 public Date getCurrentDate() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    dateFormat.format(date);
    return date;
}

dateFormat.format(date)将返回yyyy-MM-dd格式的字符串日期,但是您将从此方法返回日期,该日期将在'Thu Aug 08 12:21:34 IST 2013'中返回日期在'2013-08-08'这个。因此,您应该将String作为此方法的返回值,然后将其与equals进行比较。 试试这个,我认为这应该对你有帮助。