2015-12-15 29 views
4

我必須取得任何一個月的上個星期四的日期,但是我面臨的問題是month of dec'15上個星期四是31-dec-2015但是我得到24-dec-2015以下代碼:如何在java中獲得最後一個星期四

Date getLastThursday(def month, def year) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(year, month,1) 
    cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK)%7+2)); 
    return cal.getTime(); 
} 

還解釋我這條代碼如何在內部工作?

cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK)%7+2))

+0

你考慮到一個事實,即月份是以0爲基礎的? 12月是11. – Tunaki

+0

是的,我檢查了每個可能的值。 –

+0

是的,我從那裏得到了參考。 –

回答

8

如果您使用Java 8+,您可以使用時間調整(在Java API時間的一部分):

int month = 12; 
int year = 2015; 
LocalDate lastThursday = LocalDate.of(year, month, 1).with(lastInMonth(THURSDAY)); 
System.out.println("lastThursday = " + lastThursday); //prints 2015-12-31 

注:需要靜態導入

import static java.time.DayOfWeek.THURSDAY; 
import static java.time.temporal.TemporalAdjusters.lastInMonth; 

如果你不能使用新的API,我懷疑問題是在模數運算,這應該工作:

//month should be 0-based, i.e. use 11 for December 
static Date getLastThursday(int month, int year) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(year, month + 1, 1); 
    cal.add(Calendar.DAY_OF_MONTH, -((cal.get(Calendar.DAY_OF_WEEK) + 2) % 7)); 
    if (cal.get(Calendar.MONTH) != month) cal.add(Calendar.DAY_OF_MONTH, -7); 
    return cal.getTime(); 
} 

第二個如果有條件確保我們回去了一個月。

+0

我使用java 7,所以請告訴我格里高利日曆。 –

+0

嘿,這將只適用於十二月。 –

+0

@ user3666156看我的編輯 - 現在應該沒問題(它適用於1900年至2100年之間的所有日期)。 – assylias

0

只要把你的模%外:

cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK)+2)%7); 

如果沒有,你得到-8 => 12月24日

和使用一個月+ 1

相關問題