比较Java中的日期 - 只有年,月和日

时间:2013-08-23 12:19:51

标签: java date

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

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

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

是否有简单比较日,月,年的Java方法或者我必须比较每个值?

12 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:4)

如果您不想使用外部库并且使用Calendar没有问题,您可以尝试这样的事情:

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

不是那么简单但是......

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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
}

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

最好避免使用Java的Date并使用例如JodaTime

答案 6 :(得分:1)

TL;博士

  

我想比较几天,几个月和几年。

     

mydate 2013-08-23

     

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

如果您想动态捕捉当前日期。

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项目扩展。请参阅Tutorial

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,该dayOfMonth仅描述没有任何时间或时区的日期(用于确定日期的时区除外)。

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

如果你想检查组成元素,Joda-Time提供的方法包括{{3}},hourOfDay等。

答案 7 :(得分: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
    }

答案 8 :(得分:0)

你可以试试这个

    Date d1= ...
    Date d2= ...
    long dayInMillis = 24 * 3600 * 1000; 
    boolean dateEqual = d1.getTime() / dayInMillis == d2.getTime() / dayInMillis;  

答案 9 :(得分:0)

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

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

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

    将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和使用感兴趣的本地TimeZone构造的Java API Calendar对象gc

答案 10 :(得分: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");

答案 11 :(得分:0)

使用Java日历仅比较2个日历对象之间的日期部分而不必清除()调用Calendar.getInstance()时设置的所有其他日历字段(MINUTE,MILLISECOND等)的示例。

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

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