簡體   English   中英

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

[英]Comparing dates in Java - only years, months and days

我想與date對象進行比較。 只有一個問題是我想比較幾天,幾個月和幾年。

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

如果我比較幾天(23-08-2013)日期是相等的,如果我使用.after()。之前()方法日期是不同的。

是否有簡單比較日,月,年的Java方法或者我必須比較每個值?

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

這將完美地工作.........

如果您不想使用外部庫並且使用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);

不是那么簡單但是......

不幸的是,核心Java API中的日期支持非常弱。 您可以使用Calendar從日期中刪除時間/時區信息。 你可能想要寫一個單獨的方法來做到這一點。 你也可以使用Joda API來支持日期/時間,因為它比Java更好。

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
}

等等

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

JDK中沒有任何內容。 你可以使用一些外部庫作為Apache Commons Lang 有一種方法DateUtils.isSameDay(Date, Date)您的需求。

更好的方法是避免使用Java的Date並使用例如JodaTime

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項目擴展。 請參閱教程

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等方法。

這樣怎么樣

    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
    }

你可以試試這個

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

這個問題的解決方案非常簡單。 您需要首先將日期時間字符串解析為Java API中的Date時刻(您可以使用SimpleDateFormat對象來幫助您執行此操作)。

如果您有兩個時間表示為日期:

  1. 獲取兩個整數的表示
  2. 因為所有日期都在UTC內部表示,所以通過添加或減去GMT +/- DST的偏移量來調整本地時區
  3. 將兩者都轉換為整數天數(包括比較年份和月份的粒度)
  4. 比較它們的自然順序; 如果整數相等,則無論當地時間如何,日,月和年都是相等的(當然,假設兩個日期時刻都在同一時區)。

普雷斯托!

將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

僅使用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");

使用Java Calendar僅比較2個日歷對象之間的日期部分而不必清除()所有其他日歷字段(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;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM