如何从Date对象中修剪分钟,小时和秒?

Rom*_*man 11 java date

我需要制作日期是键的地图.如果2个日期对象具有相同的getTime()方法值,则它们是等于的.

我只对年,月,日感兴趣.如何trim获得"清除"日期不必要的小时和分钟?

Osc*_*Ryz 24

您可以创建一个trim方法:

public static Date trim(Date date) {
      Calendar cal = Calendar.getInstance();
      cal.clear(); // as per BalusC comment.
      cal.setTime( date );
      cal.set(Calendar.HOUR_OF_DAY, 0);
      cal.set(Calendar.MINUTE, 0);
      cal.set(Calendar.SECOND, 0);
      cal.set(Calendar.MILLISECOND, 0);
      return cal.getTime();
 }
Run Code Online (Sandbox Code Playgroud)

并使用它像:

 map.put( trim( aDate ), xyz() );
Run Code Online (Sandbox Code Playgroud)

...

 map.get( trim( otherDate ));
Run Code Online (Sandbox Code Playgroud)

这是一个完整的工作样本:

import java.util.Calendar;
import java.util.Date;
import static java.util.Calendar.*;
import static java.lang.System.out;


public class DateTest {
    public static void main( String [] args )  throws InterruptedException {
            Date date = new Date();
            Thread.sleep(1);
            Date other = new Date();
            out.printf("equals? = %s, hashCode? = %s %n", (date.equals(other)), (date.hashCode() == other.hashCode()));

            Date todayeOne = trim( date );
            Date todayTwo  = trim( date );


            out.printf("equals? = %s, hashCode? = %s %n", (todayeOne.equals(todayTwo)), (todayeOne.hashCode() == todayTwo.hashCode()));

    }

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

}
Run Code Online (Sandbox Code Playgroud)

输出:

$ java DateTest 
equals? = false, hashCode? = false 
equals? = true, hashCode? = true 
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 3

使用自定义Comparator<Date>TreeMap<Date,V>.

    Comparator<Date> ymdComparator = new Comparator<Date>() {
        @Override public int compare(Date d1, Date d2) {
            return 
                d1.getYear() < d2.getYear() ? -1 :
                d1.getYear() > d2.getYear() ? +1 :
                d1.getMonth() < d2.getMonth() ? -1 :
                d1.getMonth() > d2.getMonth() ? +1 :
                d1.getDay() < d2.getDay() ? -1 :
                d1.getDay() > d2.getDay() ? +1 :
                0;
        }
    };

    SortedMap<Date,V> map = new TreeMap<Date,V>(ymdComparator);
Run Code Online (Sandbox Code Playgroud)

哦,java.util.Date糟糕,使用 Joda Time 等。

  • +1 表示比较器,-1 表示已弃用的方法,+1 表示吸吮。 (6认同)