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

Java 查找给定日期范围内的所有周六和周日,java,calendar,Java,Calendar,我想从给定的日期范围内取所有周六和周日 我的意见是 开始日期:2011年1月1日 截止日期:2012年1月1日 现在,搜索日期介于给定的开始日期和结束日期之间,日期为周六或周日 请建议…我建议看一下RFC-2445 Java开源库。您可以创建一个在周六和周日重复的每周定期规则,然后在指定的时间段内迭代以获取所有日期 我认为,您可以使用以下方法-它非常简单,并且不需要使用其他库 取工作日编号(周一=1,周日=7)。然后-选择新的开始日期,即第一个星期日->它是startDate+(7-weekda

我想从给定的日期范围内取所有周六和周日

我的意见是

开始日期:2011年1月1日 截止日期:2012年1月1日

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


请建议…

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

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

取工作日编号(周一=1,周日=7)。然后-选择新的开始日期,即第一个星期日->它是startDate+(7-weekdayNum)。通过相同的算法,您可以从interval中提取上周日(我想可以减去EndDate-weekdayNum-1)。现在,您可以对所有发生的事件进行循环(使用增量步骤7)。或者,如果您想要特定的事件,例如第三个星期天,您可以简单地执行newStartDate+3*7


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

首先,如果可能的话,我建议您使用。它是一个比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;
    }                                            
}
import java.util.*;
导入org.joda.time.*;
公开课考试
{
公共静态void main(字符串[]args)
{
列表日期=getWeekendDates
(新的本地日期(2011年1月1日),新的本地日期(2011年12月1日));
对于(本地日期:日期)
{
系统输出打印项次(日期);
}
}
私有静态列表getWeekendDates
(LocalDate开始,LocalDate结束)
{
列表结果=新建ArrayList();
对于(LocalDate=start;
日期。在(结束)之前;
日期=日期加星期日(1))
{
int day=date.getDayOfWeek();
//这些可以通过。。。
如果(天)=DateTimeConstants.SATURDAY||
day==DateTimeConstants.SUNDAY)
{
结果。添加(日期);
}
}
返回结果;
}                                            
}

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

import java.util.ArrayList;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.HashMap;
导入java.util.List;
/**
* 
*@author varun.vishwakarma
*/
公共类FindWeekendIndateRange{
静态HashMap daysOfWeek=null;
静止的{
daysOfWeek=新建HashMap();
daysOfWeek.put(新整数(1),“Sun”);
daysOfWeek.put(新整数(2),“Mon”);
daysOfWeek.put(新整数(3),“Tue”);
daysOfWeek.put(新整数(4),“Wed”);
daysOfWeek.put(新整数(5),“Thu”);
daysOfWeek.put(新整数(6),“Fri”);
daysOfWeek.put(新整数(7),“Sat”);
}
/**
* 
*@param from_date
*@param to_date
*@返回
*/
公共静态列表CalculateWekendsInDateReage(日期fromDate,日期toDate){
List listOfWeekends=新的ArrayList();
Calendar from=Calendar.getInstance();
Calendar to=Calendar.getInstance();
from.setTime(fromDate);
to.设置时间(toDate);
而(从.getTimeInMillis()到.getTimeInMillis()){
if(daysOfWeek.get(from.get(Calendar.DAY OF theu WEEK))=“Sat”){
Date sat=from.getTime();
添加(sat)周数列表;
}else if(daysOfWeek.get(from.get(Calendar.DAY OF theu WEEK))=“Sun”){
Date sun=from.getTime();
添加(sun);
}
from.add(日历日/月,1);
}
返回星期五列表;
}
公共静态void main(字符串[]args){
字符串fromDate=“2019年10月7日”;
字符串toDate=“2019年10月25日”;
System.out.println(FindWeekendIndateRange.calculateWeekendsInDateReange(新日期(fromDate),新日期(toDate));
}

}
我假设您的开始和结束日期以毫秒为单位。循环浏览日期,检查日期是
星期六
还是
星期天
。下面我返回给定日期范围内周六和周日的总数

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;
}
private int totalweekendday(长起点、长终点)
{
int结果=0;
long dayInMS=时间单位.DAYS.toMillis(1);
(长i=开始;i)