Как обрезать минуты и часы и секунды от объекта Даты?

Я должен сделать карту, где Даты являются ключами. 2 объекта даты, равняется, если у них есть то же значение getTime() метод.

Мне интересно только в году, месяце и дне. Как может я trim ненужные часы и минуты для получения 'ясных' дат?

11
задан Eric Mickelsen 5 May 2010 в 17:52
поделиться

4 ответа

Используйте пользовательский Компаратор <Дата> для TreeMap .

    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);

О, java.util.Date отстой, используйте Joda Time и т. Д.

3
ответ дан 3 December 2019 в 03:04
поделиться

Просто преобразуйте ваши объекты Date в одинаковые, если у них один и тот же год, месяц и день:

public static Date convertDate(Date oldDate) {
    final long oneDay = 1000 * 60 * 60 * 24;
    long newDate = oldDate.getTime() / oneDay;
    return new Date( newDate * oneDay );
}
0
ответ дан 3 December 2019 в 03:04
поделиться
long time1 = myDate1.getTime()/(1000*60*60*24);
long time2 = myDate2.getTime()/(1000*60*60*24);
if (time1 == time2)
    // equal!

Незначительные значения помещаются ниже десятичной дроби, затем целочисленное деление обрезает их, поэтому остаются только значения, значимые на уровне дня и выше.

Если вы хотите сделать эти даты снова, просто примените смещение обратно к усеченным значениям:

myDate1.setTime(time1 * (1000*60*60*24));
myDate2.setTime(time2 * (1000*60*60*24));
1
ответ дан 3 December 2019 в 03:04
поделиться

Вы можете создать метод 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();
 }

И использовать его как:

 map.put( trim( aDate ), xyz() );

...

 map.get( trim( otherDate ));

Вот полный рабочий пример:

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();
     }

}

output:

$ java DateTest 
equals? = false, hashCode? = false 
equals? = true, hashCode? = true 
24
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: