4

我想比较两个java.util.Date对象的日期部分。我怎样才能做到这一点?我不想分别比较日期、月份和年份。

提前致谢!

4

5 回答 5

4

commons-lang DateUtils 为这个问题提供了一个很好的解决方案:

看这个

有了这个,您可以Date在一行中比较两个实例,而忽略了Date您想要的每个部分。

Date date1 = new Date(2011, 8, 30, 13, 42, 15);
    Date date2 = new Date(2011, 8, 30, 15, 23, 46);
    int compareTo = DateUtils.truncatedCompareTo(date1, date2,
            Calendar.DAY_OF_MONTH);

在本例中, 的值为compareTo0。

于 2011-09-30T11:40:40.323 回答
3

ADate只是时间的一瞬间。当您对其应用日历和时区时,它仅在日期方面真正“意味着”任何东西。Calendar因此,如果您想坚持使用标准 Java API ,您应该真正关注- 您可以创建一个Calendar具有正确Date时区的对象,然后将时间组件设置为 0。

但是,使用Joda Time开始会更好,它的LocalDate类型更准确地反映了您感兴趣的内容。

于 2011-09-30T11:22:03.753 回答
2

使用Calendar.set()Calendar.HOUR_OF_DAY和将所有这些字段设置为0 Calendar.MINUTECalendar.SECONDCalendar.MILLISECOND

这个重复问题的答案将很有用:Resetting the time part of a timestamp in Java

于 2011-09-30T11:21:55.743 回答
1

在下面找到使用 Joda Time 并支持时区的解决方案。因此,您将在 JVM 中当前配置的时区中获取日期和时间(进入currentDate和)。currentTime

请注意 Joda Time 不支持闰秒。因此,您可能会偏离真实值大约 26 或 27 秒。这可能要在未来 50 年才能解决,到时累积误差会接近 1 分钟,人们才会开始关心它。

另见:https ://en.wikipedia.org/wiki/Leap_second

/**
 * This class splits the current date/time (now!) and an informed date/time into their components:
 * <lu>
 *     <li>schedulable: if the informed date/time is in the present (now!) or in future.</li>
 *     <li>informedDate: the date (only) part of the informed date/time</li>
 *     <li>informedTime: the time (only) part of the informed date/time</li>
 *     <li>currentDate: the date (only) part of the current date/time (now!)</li>
 *     <li>currentTime: the time (only) part of the current date/time (now!)</li>
 * </lu>
 */
public class ScheduleDateTime {
    public final boolean schedulable;
    public final long millis;
    public final java.util.Date informedDate;
    public final java.util.Date informedTime;
    public final java.util.Date currentDate;
    public final java.util.Date currentTime;

    public ScheduleDateTime(long millis) {
        final long now = System.currentTimeMillis();
        this.schedulable = (millis > -1L) && (millis >= now);

        final TimeZoneUtils tz = new TimeZoneUtils();

        final java.util.Date          dmillis   = new java.util.Date( (millis > -1L) ? millis : now );
        final java.time.ZonedDateTime zdtmillis = java.time.ZonedDateTime.ofInstant(dmillis.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdmillis  = java.util.Date.from(tz.tzdate(zdtmillis));
        final java.util.Date          ztmillis  = new java.util.Date(tz.tztime(zdtmillis));

        final java.util.Date          dnow   = new java.util.Date(now);
        final java.time.ZonedDateTime zdtnow = java.time.ZonedDateTime.ofInstant(dnow.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdnow  = java.util.Date.from(tz.tzdate(zdtnow));
        final java.util.Date          ztnow  = new java.util.Date(tz.tztime(zdtnow));

        this.millis       = millis;
        this.informedDate = zdmillis;
        this.informedTime = ztmillis;
        this.currentDate  = zdnow;
        this.currentTime  = ztnow;
    }
}



public class TimeZoneUtils {

    public java.time.Instant tzdate() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tzdate(zdtime);
    }
    public java.time.Instant tzdate(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final java.time.Instant instant = zddate.toInstant();
        return instant;
    }

    public long tztime() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tztime(zdtime);
     }
    public long tztime(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final long millis = zddate.until(zdtime, java.time.temporal.ChronoUnit.MILLIS);
        return millis;
    }
}
于 2015-07-10T12:13:45.757 回答
1
于 2016-08-21T21:16:49.287 回答