Найти все субботы и воскресенья из заданного диапазона дат

#java #calendar

#java #Календарь

Вопрос:

Я хочу взять всю субботу и воскресенье из заданного диапазона дат…

мои входные данные

Дата начала: 01/01/2011 Дата окончания: 01/01/2012

теперь дата поиска, которая находится между заданной датой начала и датой окончания, и днем будет суббота или воскресенье.

Пожалуйста, предложите…

Комментарии:

1. joda-time.sourceforge.net

Ответ №1:

Во-первых, я бы рекомендовал использовать время Joda, если это возможно. Это гораздо лучший API даты и времени, чем тот, который встроен в Java.

Во-вторых, если вы действительно не беспокоитесь об эффективности, я бы лично выбрал невероятно простой, но несколько расточительный подход, заключающийся в простом повторении каждого дня за период времени, включая те, которые приходятся на нужные дни. Чередование добавления одного дня и добавления шести дней, безусловно, было бы более эффективным, но его сложнее изменить.

Пример кода:

 import java.util.*;
import org.joda.time.*;

public class Test
{
    public static void main(String[] args)
    {
        List<LocalDate> dates = getWeekendDates
            (new LocalDate(2011, 1, 1), new LocalDate(2011, 12, 1));
        for (LocalDate date : dates)
        {
            System.out.println(date);
        }
    }

    private static List<LocalDate> getWeekendDates
        (LocalDate start, LocalDate end)
    {
        List<LocalDate> result = new ArrayList<LocalDate>();
        for (LocalDate date = start;
             date.isBefore(end);
             date = date.plusDays(1))
        {
            int day = date.getDayOfWeek();
            // These could be passed in...
            if (day == DateTimeConstants.SATURDAY ||
                day == DateTimeConstants.SUNDAY)
            {
                result.add(date);
            }
        }
        return resu<
    }                                            
}
  

Ответ №2:

Я рекомендую взглянуть на эту библиотеку Java с открытым исходным кодом RFC-2445. Вы можете создать правило еженедельного повторения с повторением в субботу и воскресенье, а затем выполнить итерацию по указанному периоду, чтобы получить все даты.

Ответ №3:

Я думаю, вы можете использовать следующий способ — это действительно просто, и вам не нужно использовать другие библиотеки.

Возьмите номер дня недели (для понедельника = 1, воскресенье = 7). Затем — выберите новую начальную дату, которая является первым воскресным событием -> это StartDate (7 — weekdayNum). По тому же алгоритму вы можете взять последнее воскресенье из интервала (я думаю, путем вычитания EndDate — weekdayNum — 1). И теперь вы можете перейти в цикл for через все события (используйте инкрементный шаг 7). Или, если вам нужно конкретное событие, например, 3-е воскресенье, вы можете просто выполнить newStartDate 3 * 7 .

Надеюсь, это понятно. Я не уверен, верны ли цифры. Надеюсь, это поможет понять проблему.

Ответ №4:

Вот полный пример. Пожалуйста, предложите, можем ли мы сделать это лучше.

 import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 
 * @author varun.vishwakarma
 */
public class FindWeekendsInDateRange {
static HashMap<Integer, String> daysOfWeek=null;


static {
	daysOfWeek = new HashMap<Integer, String>();
	daysOfWeek.put(new Integer(1), "Sun");
	daysOfWeek.put(new Integer(2), "Mon");
	daysOfWeek.put(new Integer(3), "Tue");
	daysOfWeek.put(new Integer(4), "Wed");
	daysOfWeek.put(new Integer(5), "Thu");
	daysOfWeek.put(new Integer(6), "Fri");
	daysOfWeek.put(new Integer(7), "Sat");
}

/**
 * 
 * @param from_date 
 * @param to_date
 * @return 
 */
public static List<Date>  calculateWeekendsInDateReange(Date fromDate, Date toDate) {
	List<Date> listOfWeekends = new ArrayList<Date>();
		Calendar from = Calendar.getInstance();
		Calendar to = Calendar.getInstance();
		from.setTime(fromDate);
		to.setTime(toDate);
		while (from.getTimeInMillis() < to.getTimeInMillis()) {
			if (daysOfWeek.get(from.get(Calendar.DAY_OF_WEEK)) == "Sat") {
				Date sat = from.getTime();
				listOfWeekends.add(sat);
			} else if (daysOfWeek.get(from.get(Calendar.DAY_OF_WEEK)) == "Sun") {
				Date sun = from.getTime();
				listOfWeekends.add(sun);
			}
			from.add(Calendar.DAY_OF_MONTH, 1);
		}
	return listOfWeekends;
}
public static void main(String[] args) {
	String fromDate = "7-Oct-2019";
	String toDate = "25-Oct-2019";
	System.out.println(FindWeekendsInDateRange.calculateWeekendsInDateReange(new Date(fromDate), new Date(toDate)));


}

}  

Ответ №5:

Я предполагаю, что ваши даты начала и окончания указаны в миллисекундах. Перебирайте даты и проверяйте, являются ли дни 'Saturday' или 'Sunday' . Ниже я возвращаю общее количество субботы и воскресенья в заданном диапазоне дат.

 private int totalWeekendDays(long start, long end)
{
    int result=0;
    long dayInMS = TimeUnit.DAYS.toMillis(1);
    for (long i = start; i<=end; i = i   dayInMS)
    {
        String dayOfTheWeek = (String) DateFormat.format("EEEE", i);
        if (dayOfTheWeek.equals("Sunday")||dayOfTheWeek.equals("Saturday"))
        {
            result = result 1;
        }
    }
    return resu<
}