我想从给定的日期范围中取出所有星期六和星期日...
我的输入是
开始日期:01/01/2011 截止日期:01/01/2012
现在搜索日期介于给定的开始日期和结束日期之间,日期为星期六或星期日。
请建议......
答案 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;
}