我如何获得特定年份的所有星期日日期?

时间:2009-03-02 05:44:38

标签: java

完全重复: 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月的所有星期日日期

2 个答案:

答案 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

我知道确定,创建了两个变量:iinc。它将i设置为0,将inc设置为1。

在运行循环的每次迭代之前,检查循环的条件。它是:

i < 366 && cal.get(Calendar.YEAR) == year

检查i是否仍然小于366以及cal中存储的日期YEAR year。实际上,这确保了我们仍处于开始的同一年。

for的最后一部分是:

i+=inc

inc的值添加到i的值并将其存储在i中。

那么到目前为止我们在循环中有什么?

  1. 循环以i为0,inc为1
  2. 开头
  3. 循环一直持续
    • i小于公历年的长度(闰年为366),
    • (AND)cal中的日期与year中的年份相同。
  4. iinc
  5. 推进

    让我们再看一下循环的主体:

    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_MONTHaddcal。这意味着在循环的下一次迭代中,表达式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