查找给定日期范围内的所有星期六和星期日

时间:2011-10-11 06:24:46

标签: java calendar

我想从给定的日期范围中取出所有星期六和星期日...

我的输入是

开始日期:01/01/2011 截止日期:01/01/2012

现在搜索日期介于给定的开始日期和结束日期之间,日期为星期六或星期日。

请建议......

5 个答案:

答案 0 :(得分:1)

首先,如果可能的话,我建议使用Joda Time。这是一个很多更好的日期和时间API,而不是Java内置的API。

其次,除非你真的担心效率,否则我会亲自去寻找一种非常简单但有些浪费的方法,简单地在这段时间内每天都进行迭代,包括那些落在正确日子里的那些。在增加一天和增加六天之间交替肯定会更有效率,但更难改变。

示例代码:

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 result;
    }                                            
}

答案 1 :(得分:0)

我建议您查看this RFC-2445 Java开源库。您可以在Sat和Sun上重复创建每周重复规则,然后在指定的时间段内迭代以获取所有日期。

答案 2 :(得分:0)

我认为,您可以使用以下方式 - 它非常简单,您不需要使用其他库。

采用工作日编号(周一= 1,周日= 7)。然后 - 选择新的开始日期,即第一个星期日出现 - &gt;它是startDate +(7 - weekdayNum)。通过相同的算法,你可以从间隔采取最后一个星期日(通过减去EndDate - weekdayNum - 1,我认为)。现在你可以进入所有出现的循环(使用增量步骤7)。或者,如果您想要特定的出现,例如第3个星期天,你可以简单地做newStartDate + 3 * 7.

我希望,这很清楚。我不确定,如果数字是正确的。希望这有助于理解问题。

答案 3 :(得分:0)

这里是完整的示例。 请建议我们是否可以做得更好。

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)));


}

}

答案 4 :(得分:0)

我假设您的开始日期和结束日期以毫秒为单位。循环浏览日期,并检查日期是'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 result;
}