這是你有一個很酷的問題,這是解決方案,我想出了和我的方法:
首先,你有什麼:
public static void main(String[] args) {
// TODO: validate user-input
// Input by user:
int inputDayOfWeek = 3; // Tuesday
int inputWeekOfMonth = 2;
if(isInNextMonth(inputDayOfWeek, inputWeekOfMonth)){
Date outputDate = calculateNextValidDate(inputDayOfWeek, inputWeekOfMonth);
// Do something with the outputDate
System.out.println(outputDate.toString());
}
}
private static boolean isInNextMonth(int inputDayOfWeek, int inputWeekOfMonth){
// Current day:
Calendar cal = Calendar.getInstance();
int currentDayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int currentWeekOfMonth = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);
// The date has gone past in the current month
// OR though it's the same week of the month, the day of the week is past the current day of the week
return inputWeekOfMonth < currentWeekOfMonth || ((inputWeekOfMonth == currentWeekOfMonth) && inputDayOfWeek < currentDayOfWeek);
}
需要注意以下幾點:我因爲在這兩種情況下你都想去下一個月,並且使它成爲一個單獨的方法(使它成爲一個單獨的方法只是我自己的偏好,所以保持事情結構和組織)。
我注意到的另一件事是你的if和else-if中有一個錯誤。它應該是noOfWeek < currentNoOfWeek
而不是noOfWeek > currentNoOfWeek
和((noOfWeek == currentNoOfWeek) && dayOfWeek > currentDayOfWeek)
而不是((noOfWeek == currentNoOfWeek) && dayOfWeek < currentDayOfWeek)
(<
和>
是相反的)。
現在calculateNextValidDate方法,這是你的問題所在。我的方法如下:
- 開始在下個月
- 圍棋的第一天到這個月的正確周
- 然後去這個星期的正確日子
這給了我下面的代碼:
private static Date calculateNextValidDate(int inputDayOfWeek, int inputWeekOfMonth){
// Set the first day of the next month as starting position:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
// Now first go to the correct week of this month
int weekOfNextMonth = 1;
while(weekOfNextMonth < inputWeekOfMonth){
// Raise by a week
cal.add(Calendar.DAY_OF_MONTH, 7);
weekOfNextMonth++;
}
// Now that we have the correct week of this month,
// we get the correct day
while(cal.get(Calendar.DAY_OF_WEEK) != inputDayOfWeek){
// Raise by a day
cal.add(Calendar.DAY_OF_MONTH, 1);
}
return cal.getTime();
}
這段代碼給了我以下輸出(2014年11月5日星期三-wi第3 [Tuesday]
和2
作爲輸入):
Tue Dec 09 17:05:42 CET 2014
還要注意// TODO:
我已經在這個支柱的所述第一代碼部分的主方法添加。如果用戶輸入無效(例如,如周負面或dayOfMonth),則可能會經歷多次while循環。我把它留給你來驗證用戶輸入。
顯示您嘗試過的代碼。 – Jens 2014-11-05 10:01:28
@Jens:我已經用代碼更新了我的問題。請幫助我。 – Shibankar 2014-11-05 10:36:31