11

2つのカレンダーオブジェクトを比較する方法はありますが、ミリ秒は無視しますか?

2つのカレンダーオブジェクトを比較するテストケースを作成しましたが、問題があります。日、月、分、時間のすべてが一致しますが、ミリ秒は一致しません。実際の日付を取得する前に、予定日を取得します。

/**
 * @return
 */
private Calendar getExpectedOneMonthDateFromCurrentDate() {
    Calendar expectedOneMonth = Calendar.getInstance();
    expectedOneMonth.add(Calendar.MONTH, -1);
    return expectedOneMonth;
}

assertEquals(getExpectedOneMonthDateFromCurrentDate(),
             DateRange.LAST_ONE_MONTH.getToDate());
4

11 に答える 11

18

カレンダーからミリ秒を削除します

cal.set(Calendar.MILLISECOND, 0);
于 2012-08-07T11:02:14.073 に答える
4

使用する必要があります

cal.set(Calendar.MILLISECOND, 0);

そしておそらく同様に

cal.set(Calendar.SECOND, 0);

一致する分だけが必要な場合。

于 2012-08-07T11:03:06.827 に答える
3

ミリ秒を 0 に設定するソリューションには問題があります。日付が 12:14:29.999 と 12:14:30.003 の場合、日付をそれぞれ 12:14:29 と 12:14:30 に設定すると、あなたがしたくない違い。

私はコンパレータについて考えました:

private static class SecondsComparator implements Comparator<Calendar>
{
    public int compare(Calendar o1, Calendar o2)
    {
        final long difference = o1.getTimeInMillis() - o2.getTimeInMillis();
        if (difference > -1000 && difference < 1000)
            return 0;
        else
            return difference < 0 ? 1 : -1;
    }
}

public static void main(String args[])
{
    Calendar c1 = Calendar.getInstance();
    Utils.waitMilliseconds(100);
    Calendar c2 = Calendar.getInstance();
    // will return 0 
    System.out.println(new SecondsComparator().compare(c1,c2));
}

ただし、この Comparator は次のルールに違反しているため、これも良い解決策ではありません。

実装者は、すべての z について、x.compareTo(y)==0 が sgn(x.compareTo(z)) == sgn(y.compareTo(z)) を意味することを確認する必要があります。

につながるもの(x=y and y=z) => x=z

だから解決策がわかりません...しかし、実際、いくつかの異なる日付を定義すると、それら異なりますよね?

于 2012-08-07T14:03:07.703 に答える
2

IMHO 最も簡単な方法は、Apache Commons DateUtils ( Apache Commons DateUtils ) の truncate() を使用してミリ秒を削除し、結果の日付を比較することです。

于 2012-08-07T11:07:24.313 に答える
1

1 つのオプションは、Calendar.set(Calendar.MILLISECOND, 0) を呼び出してミリ秒をクリアすることです。もう 1 つは、 getTimeInMillis() を呼び出して、両方のカレンダーの時間をミリ秒単位で取得することです。次に、比較してミリ秒を削除する前に、これらを 1000 で割ることができます。

于 2012-08-07T11:03:20.760 に答える
0
clearMilis(date1).compareTo(clearMilis(date2))


/**
 * @param date date
 *
 * @return truncated miliseconds
 */
@Nonnull
public static Date clearMillis(final @Nonnull Date date)
{
    DateTime result = new DateTime(date);

    return result.minusMillis(result.getMillisOfSecond()).toDate();
}
于 2013-04-25T18:40:40.147 に答える
0

基本的な日付操作以外に何かを実行している場合は、Joda Time を使用することをお勧めします。あなたの場合、そのように日付を切り捨ててから比較することができます:

DateTime dateTime = new DateTime().millisOfDay().roundFloorCopy();
于 2012-08-07T11:31:41.560 に答える
0
public static String getFromatDateTime(Date date) {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    //gc.set( Calendar.HOUR_OF_DAY, 0 );
    //gc.set( Calendar.MINUTE, 0 );
    //gc.set( Calendar.SECOND, 0 );
    //block ignore millisecond 
    gc.set( Calendar.MILLISECOND, 0 );
    String strDate = sdfDate.format(gc.getTime());
    return strDate;
}
public static void main(String[] args) throws ParseException {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date now = new  Date();
    String currentDate = Testing.getFromatDateTime(now);
    String fullDate = "2015-12-07 14:53:39.30";
    String effDateStr = Testing.getFromatDateTime(sdfDate.parse(fullDate));

    System.out.println("Currennt Date: " + currentDate);
    System.out.println("Effective Date: " + effDateStr);
    System.out.println(currentDate.compareTo(effDateStr)==0);
}
于 2015-12-08T02:18:10.000 に答える