2013-07-09 60 views
2

我遇到了一個簡單的問題,我解決了(我沒有放棄)。不過,我認爲還有一些更爲巧妙和棘手的解決方案。 問題如下:返回今天之前最後X天的日期。例如,如果今天是星期二,2013年7月,我想最後一個星期五的答案將是週五,7月05日,2013年從今天開始獲取最後的「X」天嗎?

我的解決方案如下:

public Date dateOfLast(int day) { 

     int today = calendar.get(Calendar.DAY_OF_WEEK); 

     int daysDifferences = today - day; 

     int daysToSubtract; 

     if (day < today) { 
      //last day seems to be in current week ! 
      //for example Fr > Tu. 
      daysToSubtract = -(Math.abs(daysDifferences)); 
     } else { 
      //7- (difference between days)! 
      //last day seems to be in the previous,thus we subtract the the days differences from 7 
      // and subtract the result from days of month. 
      daysToSubtract = -(7 - Math.abs(daysDifferences)); 
     } 
     //subtract from days of month. 
     calendar.add(Calendar.DAY_OF_MONTH, daysToSubtract); 
     return calendar.getTime(); 
    } 

誰能給我一個數學公式還是更簡單的解決方案?

+2

您的解決方案對我來說很好。 – arshajii

+0

謝謝,但我認爲有更好的一個 – Adelin

回答

2
int daysToSubtract = ((today - day) + 7) % 7; 

應該沒問題,如果我沒弄錯的話。

例如

today = 4 
day = 2 
daysToSubtract = ((4 - 2) + 7) % 7 = 2 : correct 

today = 2 
day = 4 
daysToSubtract = ((2 - 4) + 7) % 7 = 5 : correct 
+0

你能解釋一下這個部分嗎? %7 – Adelin

+0

這是模運算符。它計算整數除法的其餘部分:0%7 = 0; 1%7 = 1; ...; 7%7 = 0; 8%7 = 1; ... –

+0

是的,你是90%的權利,除了我需要減去天數 int daysToSubtract = - (((今天 - 天)+7)%7); – Adelin

1

您的解決方案對我來說很好。但是,一個小竅門:你不應該需要在這裏使用Math.abs,你應該知道,你的變量,todayday的,是在你的if語句來的每一個分支更大:

if (day < today) 
    daysToSubtract = day - today; // 'today' is bigger 
else 
    daysToSubtract = day - today - 7; // 'day' is bigger 

或只是

int daysToSubtract = day - today - ((day < today) ? 0 : 7); 

請注意,我們不再需要daysDifferences變量。

+0

您可能意味着+7。否則,減去的天數將爲負數,因此您會添加天數。 –

+0

@JBNizet我認爲變量的名稱是誤導性的;看起來我們希望它是負面的。 – arshajii

+0

如果是這樣,那麼今天是錯誤的,因爲它是正面的。 –