2015-03-13 146 views
4

我想得到任何給定月份的最後一個星期日,並且它的工作到某點上,但是如果星期日是下個月的第一天,它會顯示該日期而不是同一月份上個星期。以下是java一個月的最後一個星期日

public static String getLastSunday(int month, int year) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(year, month, 1); 
    if (leap(year)) { 
     cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK) - 2)); 
    } else { 
     cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK)%7 - 1)); 
    } 
    return cal.getTime().toString().substring(0, 10); 
} 

調用該函數爲:

getLastSunday(10, 2015); 

返回輸出:

Sun Nov 01 

哪兒我去錯了嗎?此外,如果是閏年,我不確定是否從-1到-2是正確的,我研究了它,但無法找到任何有用的東西。

+0

你可以使用Java 8或JodaTime嗎? – reto 2015-03-13 07:06:10

+0

如果您無法訪問後面的庫,我建議您獲取下個月第一天的工作日並根據這些計算結果進行計算。 – Bathsheba 2015-03-13 07:08:07

+0

記住'日曆'月是零索引 – MadProgrammer 2015-03-13 07:12:27

回答

2

嘗試這種方式

public static Date getLastSunday(int month, int year) { 
     Calendar cal = Calendar.getInstance(); 
     cal.set(year, month + 1, 1); 
     cal.add(Calendar.DATE, -1); 
    cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK) - 1)); 
     return cal.getTime(); 
    } 

source

+0

其給予3月29日和它的最後一個星期日,是不是? – SpringLearner 2015-03-13 07:20:04

+0

@Braj看到這個http://ideone.com/GnPNHV – SpringLearner 2015-03-13 07:22:50

+0

它仍然給出了同樣的錯誤,我的問題不是與月份索引我知道它從0開始,並在我的主程序中我已經修復它在運行之前,我試着你答案我仍然得到Sun Nov 01 01月的最後一個星期日 – mrahmat 2015-03-13 07:42:13

1

嘗試了這一點(記住Month值是基於0的。例如,0代表一月)

Calendar cal = Calendar.getInstance(); 
cal.set(year, month, 1); 
cal.add(Calendar.MONTH, 1); 
cal.set(Calendar.DAY_OF_MONTH, 1); 
cal.add(Calendar.DATE, -1); 

cal.add(Calendar.DATE, -(cal.get(Calendar.DAY_OF_WEEK) -1)); 
return cal.getTime().toString().substring(0, 10); 

所以,如果你想打電話此方法適用於2015年10月,然後如下所示:

getLastSunday(9, 2015); 

它執行以下操作: 1.將通過的年份和monthe設置爲日曆對象 getLastSunday(9,2015); 2.然後通過使用此代碼更新日曆對象到當前月的最後一天:

cal.add(Calendar.MONTH, 1); 
cal.set(Calendar.DAY_OF_MONTH, 1); 
cal.add(Calendar.DATE, -1); 
  • 然後減去天從當前日期TOT的最後數週日: JAVA爲SUNDAY設置1個,爲MONDAY設置2個等等。所以,如果最後一天是星期一,也就是2,那麼它會從中減去1以得到本月的最後一個星期日。
  • 希望它能幫助。

    +0

    它的工作,但你能解釋一下嗎? – mrahmat 2015-03-13 07:53:34

    +0

    編輯答案。請檢查。 – Wanted 2015-03-13 13:50:51

    0

    TL;博士

    YearMonth.of(2015 , Month.NOVEMBER)        // Represent the entirety of a specified month. 
        .atEndOfMonth()            // Get the date of the last day of that month. 
        .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY)) // Move to the previous Sunday, or keep if already Sunday. 
    

    避免遺留日期時類

    的問題和其他的答案是過時的,使用現在的傳統麻煩的舊日期時間類,由的Java取代。時間類。

    使用智能對象,而不是啞元

    而不是通年份和月份爲單純的整數,通過YearMonth類的一個參數。這樣做可以確保有效的值,使您的代碼更加自我記錄,並提供類型安全性。

    YearMonth ym = YearMonth.of(2015 , Month.NOVEMBER) ; // Or YearMonth.of(2015 , 11) with sane numbering for month 1-12 for January-December. 
    

    LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

    獲取本月的最後一天。

    LocalDate endOfMonth = ym.atEndOfMonth() ; 
    

    查找上一個星期日,或者如果已經是星期日,則保留月末。使用TemporalAdjusters類中的TemporalAdjuster

    LocalDate lastSundayOfPriorMonth = endOfMonth.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY)) ; 
    

    關於java.time

    java.time框架是建立在Java 8和更高版本。這些類取代的麻煩老legacy日期時間類,如java.util.DateCalendar,& SimpleDateFormat

    Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

    從何處獲取java.time類?

    ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

    相關問題