Это было довольно прохладно, проблема у вас есть, и это решение, которое я придумал и мой подход:
Первое, что нужно было:
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 и if-else в единицу, если в обоих случаях вы хотите перейти к следующему месяцу, а также сделать его отдельным методом (сделать его отдельным методом - это только предпочтение самого себя, чтобы сохранить вещи структурированы и организованы).
Еще одна вещь, которую я заметил, - это ошибка в вашем if и else-if. Это должно быть noOfWeek < currentNoOfWeek
вместо noOfWeek > currentNoOfWeek
и ((noOfWeek == currentNoOfWeek) && dayOfWeek > currentDayOfWeek)
вместо ((noOfWeek == currentNoOfWeek) && dayOfWeek < currentDayOfWeek)
(<
и >
отменены).
Теперь вычислить метод NextValidDate, в котором была ваша проблема. Мой подход заключается в следующем:
- Start в первый день следующего месяца
- Перейти к корректному недели этого месяца
- Затем идут на правильный день недели
Это дало мне следующий код:
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();
}
Этот код дал мне следующий результат (5-го ноября 2014 года - wi го 3 [Tuesday]
и 2
в качестве входных данных):
Tue Dec 09 17:05:42 CET 2014
отметить Также // TODO:
я добавил в главной-методе первых кодовые частей этого поста. Если вход пользователя недействителен (например, отрицательная неделя или деньOfMonth), он может слишком часто проходить через циклы while. Я оставляю это для вас, чтобы проверить ввод пользователя.
Показать код, который вы пробовали. – Jens
@Jens: я обновил свой вопрос с помощью кода. Пожалуйста, помогите мне. – Shibankar