11

我正在尝试与日期对象进行比较。只有一个问题是我只想比较天、月和年。

/* toString output
mydate 2013-08-23
current date: Thu Aug 23 14:15:34 CEST 2013

如果我只比较天( 23-08-2013 )日期是相等的,如果我使用 .after() .before() 方法日期是不同的。

是否有 Java 方法可以简单地比较天、月、年,还是我必须比较每个值?

4

12 回答 12

22
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
              cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);

这将完美地工作......

于 2015-12-12T12:29:26.467 回答
4

Joda-Time要好得多,强烈推荐。但是如果你必须使用 Java api,你可以这样做——

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();

c1.setTime(someDate);
c2.setTime(someOtherDate);

int yearDiff = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
int monthDiff = c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
int dayDiff = c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);

说只比较年份,你可以做 -

if(c1.get(Calendar.YEAR) > c2.get(Calendar.YEAR)){
    // code
}

等等

于 2013-08-23T12:27:33.990 回答
4

如果您不想使用外部库并且使用日历没有问题,您可以尝试以下操作:

Calendar calendar1= Calendar.getInstance();
Calendar calendar2= Calendar.getInstance();

Date date1 = ...;
Date date2= ...;

calendar1.setTime(date1);
calendar1.set(Calendar.HOUR_OF_DAY, 0);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);
calendar1.set(Calendar.MILLISECOND, 0);

calendar2.setTime(date2);
calendar2.set(Calendar.HOUR_OF_DAY, 0);
calendar2.set(Calendar.MINUTE, 0);
calendar2.set(Calendar.SECOND, 0);
calendar2.set(Calendar.MILLISECOND, 0);

calendar1.after(calendar2);
calendar1.before(calendar2);

不是那么简单,而是……

于 2013-08-23T12:43:59.533 回答
3

不幸的是,核心 Java API 中的日期支持非常薄弱。您可以使用Calendar从日期中删除时间/时区信息。您可能想编写一个单独的方法来做到这一点。您还可以使用 Joda API 来支持日期/时间,因为它比 Java 的要好得多。

于 2013-08-23T12:22:33.163 回答
3
Date date = new Date();
String str="2013-08-23";
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);

Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);

if(cal.get(Calendar.YEAR) == cal1.get(Calendar.YEAR)){
System.out.println("Years are equal");
}
else{
System.out.println("Years not equal");
}

if(cal.get(Calendar.MONTH) == cal1.get(Calendar.MONTH)){
System.out.println("Months are equal");
}
else{
System.out.println("Months not equal");
}
于 2014-03-24T12:52:49.037 回答
2

tl;博士

我只想比较天、月和年。

我的日期 2013-08-23

当前日期:2013 年 8 月 23 日星期四 14:15:34 CEST

如果要动态捕获当前日期。

LocalDate.now(                   // Capture the current date…
    ZoneId.of( "Europe/Paris" )  // …as seen by the wall-clock time used by the people of a particular region (a time zone).
)
.isEqual(
    LocalDate.parse( "2013-08-23" ) 
)

或者,在特定的时刻。

ZonedDateTime.of(  // Thu Aug 23 14:15:34 CEST 2013
    2013 , 8 , 23 , 14 , 15 , 34 , 0 , ZoneId.of( "Europe/Paris" )     
)
.toLocalDate()     // Extract the date only, leaving behind the time-of-day and the time zone.
.isEqual(
    LocalDate.parse( "2013-08-23" ) 
)

LocalDate

捆绑的 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。正如其他答案所建议的那样,使用一个体面的日期时间库。这意味着:

您需要从日期时间中提取仅日期值,以忽略时间。Joda-Time 和 java.time 都有这样一个类,巧合地命名为LocalDate.

java.time

Java 8 和更高版本中内置的java.time框架取代了旧的 java.util.Date/.Calendar 类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继任者,在概念上相似但重新架构。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅教程

ZoneId zoneId = ZoneId.of( "Europe/Paris" );

ZonedDateTime x = ZonedDateTime.of( 2014, 1, 2, 3, 4, 5, 6, zoneId );
ZonedDateTime y = ZonedDateTime.now( zoneId );

通过调用提取和比较日期时间的仅日期部分toLocalDate

Boolean isSameDate = x.toLocalDate().isEqual( y.toLocalDate() );

乔达时间

DateTimeZone timeZoneParis = DateTimeZone.forID( "Europe/Paris" );

DateTime x = new DateTime( 2014, 1, 2, 3, 4, 5, 6, timeZoneParis );
DateTime y = new DateTime( 2014, 6, 5, 4, 3, 2, 1, timeZoneParis );

boolean isXAfterY = x.isAfter( y );

要测试日期部分的相等性,请将 DateTime 对象转换为LocalDate仅描述没有任何时间或时区(用于决定日期的时区除外)的日期。

boolean isSameDate = x.toLocalDate().isEqual( y.toLocalDate() );

如果要检查组成元素,Joda-Time 提供了dayOfMonth、 hourOfDay 等方法。

于 2014-03-25T04:28:04.360 回答
1

不,JDK中没有任何内容。您可以使用一些外部库作为Apache Commons Lang。有一种方法DateUtils.isSameDay(Date, Date)可以满足您的需求。

最好避免使用DateJava 并使用例如JodaTime

于 2013-08-23T12:23:44.997 回答
0

这种方式怎么样

    String str="2013-08-23";
    Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
    Calendar cal=Calendar.getInstance();
    cal.setTime(date);
    Calendar calNow=Calendar.getInstance();

    if(cal.get(Calendar.YEAR)>calNow.get(Calendar.YEAR)){
        // do something
    }if(cal.get(Calendar.MONTH)>calNow.get(Calendar.MONTH)){
        // do something
    }if(cal.get(Calendar.DATE)>calNow.get(Calendar.DATE)){
       // do something
    }
于 2013-08-23T12:27:16.883 回答
0

你可以试试这个

    Date d1= ...
    Date d2= ...
    long dayInMillis = 24 * 3600 * 1000; 
    boolean dateEqual = d1.getTime() / dayInMillis == d2.getTime() / dayInMillis;  
于 2013-08-23T12:29:37.283 回答
0

这个问题的解决方案非常简单。您需要首先将日期时间字符串解析为 Java API 中的 Date 瞬间(您可以使用 SimpleDateFormat 对象来帮助您完成此操作)。

如果您有两个表示为日期的时间瞬间:

  1. 将两者都表示为长整数
  2. 因为所有日期都在内部以 UTC 表示,所以通过添加或减去 GMT +/- DST 的偏移量来调整本地时区
  3. 将两者都转换为整数天数(包括比较年份和月份的粒度)
  4. 按自然顺序比较它们;如果整数相等,则无论本地时间如何,日、月和年都相等(当然,假设两个 Date 时刻都在同一时区)。

快!

将 Date 对象调整为本地时间并将其作为 POSIX Epoch 中的十进制天数返回的方法如下:

public static double toLocalDayNumber(Date d, GregorianCalendar gc) {

        gc.setTime(d);

        long utcDateAsMillisFromEpoch = gc.getTimeInMillis();
        long localDateAsMillisFromEpoch = utcDateAsMillisFromEpoch +
                gc.get(GregorianCalendar.ZONE_OFFSET) +
                gc.get(GregorianCalendar.DST_OFFSET);

        return (((double) localDateAsMillisFromEpoch) / (86400.0 * 1000.0);
}

此方法接受一个 Date 对象d和一个gc使用本地 TimeZone 构建的 Java API Calendar 对象。

于 2013-08-23T12:30:08.330 回答
0

通过Date仅使用

        SimpleDateFormat cDate1 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        Date now1 = new Date();
        String ccDate1 = cDate1.format(now1);
        System.out.println("Date1=="+ccDate1);


        SimpleDateFormat cDate2 = new SimpleDateFormat("yyyy-MM-dd HH-mm-sss");
        Date now2 = new Date();
        String ccDate2 = cDate2.format(now2);
        System.out.println("Date2=="+ccDate2);

        if(ccDate1.equals(ccDate2))//Get full feature of date
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

        if(ccDate1.split(" ")[0].equals(ccDate2.split(" ")[0]))//Comparing  Full Date
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

        if(ccDate1.split(" ")[0].split("-")[0].equals(ccDate2.split(" ")[0].split("-")[0]))//Comparing YEAR
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

        if(ccDate1.split(" ")[0].split("-")[1].equals(ccDate2.split(" ")[0].split("-")[1]))//Comparing MONTH
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

        if(ccDate1.split(" ")[0].split("-")[2].equals(ccDate2.split(" ")[0].split("-")[2]))//Comparing DAY
            System.out.println("Equal");
        else
            System.out.println("Not Equal");
于 2013-08-23T12:50:03.583 回答
0

一个使用 Java Calendar 仅比较 2 个日历对象之间的日期部分而无需 clear() 所有其他日历字段(MINUTE、MILLISECOND 等)的示例,这些字段在调用 Calendar.getInstance() 时设置。

我知道这个线程很旧,这不是一个新的解决方案,但可能对某些人有帮助。

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

cal1.set(2018, Calendar.JANUARY, 1);
cal2.set(2018, Calendar.JANUARY, 1);

System.out.println(_doesCalendar1DateMatchCalendar2Date(cal1,cal2)); // in this case returns true

private boolean _doesCalendar1DateMatchCalendar2Date(Calendar cal1, Calendar cal2) {
            boolean sameDate = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) 
                    && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH)
                    && cal1.get(Calendar.DATE) == cal2.get(Calendar.DATE);
            return sameDate;
        }
于 2018-07-12T00:54:13.853 回答