2014-11-05 18 views
2

Мне нужно рассчитать следующую дату на основе текущей даты. Например, скажем, сегодня '05 -NOV-2014 ', и пользователь дал вход, как в первый понедельник. поэтому на основании ввода пользователя, если первый понедельник текущего месяца уже прошел, я должен узнать 1-й понедельник следующего месяца. если 1-й понедельник еще не наступил в текущем месяце, я должен узнать дату в текущем месяце.Как получить дату следующего указанного дня недели

Я использую класс java.util.Calendar.

//user inputs 
int dayOfWeek = 3; // as user has provided 'Tuesday' 
int noOfWeek = 1; // as user provided 1st 

Calendar cal = Calendar.getInstance(); // getting the current instance. 
int currentDayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); // getting the cCurrentDayOfWeek in integer. 
int currentNoOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK_IN_MONTH); // getting which week it is in the current month 


if(noOfWeek < currentNoOfWeek){ 
// the date has gone past in the current month. 
} 
else if ((noOfWeek == currentNoOfWeek) && dayOfWeek < currentDayOfWeek){ 
// though the week number is same but as the currentDayOfWeek is greater than the provided day so in this case also date has gone past in the current month. 
} 

Невозможно продолжить движение дальше. ища вашу помощь.

+0

Показать код, который вы пробовали. – Jens

+0

@Jens: я обновил свой вопрос с помощью кода. Пожалуйста, помогите мне. – Shibankar

ответ

1

Это было довольно прохладно, проблема у вас есть, и это решение, которое я придумал и мой подход:

Первое, что нужно было:

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. Я оставляю это для вас, чтобы проверить ввод пользователя.

+0

спасибо. Ты спас мой день.Приветствия! !! – Shibankar

0

Вот идея. Продолжайте свертывать экземпляр вашего календаря в один день [cal.add (DAY, 1)] за итерацию (т. Е. Завершать цикл), каждый раз проверяя, что вы находитесь в день/неделю, указанный в качестве ввода. Завершите и извлеките дату, как только это условие будет выполнено.

Также замените вызовы Calendar.getInstance(). Get() для cal.get() после объявления переменной cal.

Смежные вопросы