完全重复: How to get all dates of sundays in a particular year in Java
int year = 2009;
Calendar cal = new GregorianCalendar(year, Calendar.JANUARY, 1);
for (int i = 0, inc = 1; i < 366 && cal.get(Calendar.YEAR) == year; i+=inc) {
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
// this is a sunday
cal.add(Calendar.DAY_OF_MONTH, 7);
inc = 7;
} else {
cal.add(Calendar.DAY_OF_MONTH, 1);
}
}
在Miles D given code,我将获得从第一个月的第二个星期日到明年的第一个星期日的所有星期日的日期。实际上我只想找一个特定的年份,它的所有星期日日期,你可以再次看到它.......
例如,我需要2009年1月至2009年12月的所有星期日日期
答案 0 :(得分:2)
编程新手?好吧,让我们一起看一下代码吧!
我看到的第一件事是循环中的条件:
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
检查日历cal
中存储的当前日期DAY_OF_WEEK
是否为SUNDAY
。如果是,它会做一件事,如果不是,那就做另一件事。
现在我们知道循环的“大脑”正在寻找什么,让我们来看看循环的声明:
for (int i = 0, inc = 1; i < 366 && cal.get(Calendar.YEAR) == year; i+=inc)
for
循环分为三个部分:初始化,条件和“增量”。
初始化只在循环开始运行之前运行一次:
int i = 0, inc = 1
我知道确定,创建了两个变量:i
和inc
。它将i
设置为0,将inc
设置为1。
在运行循环的每次迭代之前,检查循环的条件。它是:
i < 366 && cal.get(Calendar.YEAR) == year
检查i
是否仍然小于366以及cal
中存储的日期YEAR
year
。实际上,这确保了我们仍处于开始的同一年。
for的最后一部分是:
i+=inc
将inc
的值添加到i
的值并将其存储在i
中。
那么到目前为止我们在循环中有什么?
i
为0,inc
为1 i
小于公历年的长度(闰年为366),cal
中的日期与year
中的年份相同。i
由inc
让我们再看一下循环的主体:
if (condition_that_checks_if_it_is_a_sunday) {
// this is a sunday
cal.add(Calendar.DAY_OF_MONTH, 7);
inc = 7;
} else {
cal.add(Calendar.DAY_OF_MONTH, 1);
}
正如您所看到的,如果是星期天,则会发生两件事:inc
设为7,DAY_OF_MONTH
为add
为cal
。这意味着在循环的下一次迭代中,表达式i+=inc
将意味着i+=7
而不是i+=1
,这是inc
为1时所做的(就像是初始化完成了。)
如果不是星期日,则DAY_OF_WEEK
会添加一个cal
。
那么我们在循环体中有什么?
cal
是否是星期天
cal
提前7天。不仅如此,还要继续推进i
7!cal
不在星期日,请将其提前到一周的第二天,让i
继续前进1. 换句话说,循环将从cal
的初始值开始,并一次向前移动cal
,直到找到星期日为止。一旦这样做,它会一次向前移动cal
7天,直到它超过366天,或者直到cal
再过一年!
因此,从( ahem )简要检查上面的代码,我们得出结论,它实际上并没有“获得”一年中的星期日。它只是迭代它们,由你来添加实际上与它发现的星期日有关的代码。
现在我们已经完成了代码,我确信这样做是微不足道的!这真的只是添加几行。每次循环进入“知道”cal
是星期日的部分时,你只需添加一行[在此处插入任何你想要的]。
简单,不是吗?
答案 1 :(得分:1)
这是我可能开始的算法(代码留给读者练习):
查找距离特定日期最近的星期日。例如,从1月1日开始,向前走,直到找到星期天。这应该花费不超过7次操作。
现在你知道了一个星期天,你可以简单地通过在第一个星期天加上7的倍数来计算朱利安日期的所有其他日期。
您还应该计算从12月31日开始向后的最接近的星期日,以便您知道何时停止在所选年份中包括星期日。
哦,刚刚写完,我看到someone else had the same idea already。