如何在Java中获取特定年份的所有星期日?

时间:2009-02-26 12:35:09

标签: java date

我正在认真寻找这个代码...我是新的程序员。

实际上我想用旗帜制作所有日期,这些日期都是特定年份的星期日。

拜托,我急切地等待你的回应......

10 个答案:

答案 0 :(得分:8)

创建新日历。将时间设置为1/1 / yyyy和一段时间。检查当前日期是否为星期日,并向前滚动一天,直到它为止。那是今年的第一个星期天。向前滚动7天,直到年份不再匹配,标记为你去。

答案 1 :(得分:6)

答案 2 :(得分:4)

如果我这样做,我会使用Joda Time使用LocalDate查找一年中的第一个星期日。创建1月1日,然后添加1天,直到它是星期日,然后添加7天,直到你用完一年。

LocalDate date = new LocalDate(YEAR, 1, 1);
while ( date.dayOfWeek() != 7 )
{
  date = date.addDays(1);
}

while ( date.year() == YEAR )
{
  date = date.addDays(7);
}

或类似的东西。

答案 3 :(得分:4)

这样的事情应该有效。

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

答案 4 :(得分:2)

这是一个使用java.util.Calendar和java.util.GregorianCalendar的示例代码,它打印出2009年的每个星期日。 在格式化日期时可以进行大量优化,但我会将其作为练习留给您。

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test
{
    public static void main(String[] args)
    {
        int year =2009;
        int dayOfWeek = Calendar.SUNDAY;
        String dayOfWeekString = "Sunday";
        // instantiate Calender and set to first Sunday of 2009
        Calendar cal = new GregorianCalendar();
        cal.set(2009, 0, 1, 0, 0); cal.getTime();
        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek); cal.getTime();
        int i = 1;
        while (cal.get(Calendar.YEAR) == 2009)
        {
            System.out.println(dayOfWeekString + " " + i + ": " + cal);
            cal.add(Calendar.DAY_OF_MONTH, 7);
            i++;
        }
    }
}

正如您所看到的,TiGz使用Joda Time的方式要简单得多。

答案 5 :(得分:2)

java.time

Java 8及更高版本附带了新的java.time包。灵感来自Joda-Time,由JSR 310定义,由ThreeTen-Extra项目扩展。 java.util.Date/.Calendar&amp; java.text.SimpleDateFormat等。

请注意,我们指定时区,这对于确定日期至关重要。例如,巴黎的新日早些时候比蒙特利尔早了。

ZoneId zoneId = ZoneId.of( "America/Montreal" );  // Time zone is crucial in determining the date. A new day dawns earlier in Paris than In Montréal, for example.

您可以编写此代码,仅使用LocalDate而无需任何时间。但在商业中,完整的日期时间通常更有用。所以我的示例使用ZonedDateTime

要整洁,我希望将时间设置为当天的第一时刻。您可能认为这意味着00:00:00.0,但并非总是因为Daylight Saving Time之类的异常。要对此第一时刻进行软编码,我们希望调用LocalDate上的atStartOfDay方法。所以我们从LocalDate开始,然后使用该方法获取ZonedDateTime对象。

再次注意,我们在获取今天的日期时指定了时区。一个很常见的错误是省略时区。省略时,将隐式应用JVM的当前默认时区。这意味着您的结果可能因机器或管理员的设置而异。更糟糕的是,此JVM中任何应用程序的任何线程中的任何代码都可以在运行时的任何时刻调用更改默认时区,同时应用程序执行!因此,请始终指定而不是隐含地依赖当前默认值。

LocalDate today = LocalDate.now( zoneId );  // We want a ZonedDateTime, but starting with a LocalDate in order to get first moment of the day (see next line).
ZonedDateTime todayStart = today.atStartOfDay( zoneId );  // Set time-of-day to first moment of this date, just to be neat. Usually that time is '00:00:00.0' but not always.

java.time框架包含一些方便的TemporalAdjustors来获取一年中的第一天,并从那里开始,即该月的第一个星期日。

ZonedDateTime firstOfThisYear = todayStart.with( TemporalAdjusters.firstDayOfYear( ) );
ZonedDateTime zdtFirstOfNextYear = firstOfThisYear.with( TemporalAdjusters.firstDayOfNextYear( ) );
ZonedDateTime firstSundayOfThisYear = firstOfThisYear.with( TemporalAdjusters.dayOfWeekInMonth( 1, DayOfWeek.SUNDAY ) );

现在,我们将在一年中的所有星期进行循环。我们一次增加一周,直到我们发现自己在明年。我们以List收集每个星期天。

ZonedDateTime zdt = firstSundayOfThisYear; // Var changing throughout loop.
List< ZonedDateTime > sundays = new ArrayList<>( 53 );  // Set initial capacity to maximum number of values.
while ( zdt.isBefore( zdtFirstOfNextYear ) ) {
    // Handle this iteration.
    sundays.add( zdt );
    System.out.println( "Sunday # " + sundays.size( ) + " : " + zdt );
    // Prepare next iteration.
    zdt = zdt.plusWeeks( 1 );
}

跑步时。

Sunday # 1 : 2015-01-04T00:00-05:00[America/Montreal]
Sunday # 2 : 2015-01-11T00:00-05:00[America/Montreal]
…
Sunday # 51 : 2015-12-20T00:00-05:00[America/Montreal]
Sunday # 52 : 2015-12-27T00:00-05:00[America/Montreal]

答案 6 :(得分:1)

List arrList = new ArrayList();
SimpleDateFormat format1 = new SimpleDateFormat("dd-M-yyyy");
Date date = null;
Calendar cal = Calendar.getInstance();

for (int i = 0; i <= 51; i++) 
{
    try 
    {
        cal.add(Calendar.WEEK_OF_YEAR, +1);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        String formatted = format1.format(cal.getTime());
        date = format1.parse(formatted);
        arrList.add(date);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

答案 7 :(得分:0)

一年大约有365天,所以Big-O的 n 非常易于管理。我想说从年初开始到一年的最后一天迭代,并检查每一天是否是星期天。

您至少需要Calendar.get()Calendar.DAY_OF_WEEKCalendar.SUNDAY

答案 8 :(得分:0)

我最近开发了[Lamma Date],旨在服务于此类用例。

以下代码将于2014年打印出所有星期日:

List<Date> sundays2014 = Dates.from(2014, 1, 1).to(2014, 12, 31).byWeek().on(DayOfWeek.SUNDAY).build();

for(Date date: sundays2014) {
    System.out.println(date);
}

答案 9 :(得分:0)

**这将给你一年中的所有星期日**

  

由我和朋友Hemant发明

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;





public class Test {

    public static void main(String[] args) {



        SimpleDateFormat format =new SimpleDateFormat("dd-MMM-yyyy");
        String DATE_FORMAT = "yyyy MM dd";

        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        Calendar c1 = Calendar.getInstance(); // today

        String y=sdf.format(c1.getTime());
        String years=y.substring(0,4);
        int year=Integer.parseInt(years);
        //Connection con=null;

        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
                String frm="";
                frm=format.format(cal.getTime());
            //System.out.println("From  :"+frm);

                  System.out.println("the value of the sunday is "+format.format(cal.getTime()));
                cal.add(Calendar.DAY_OF_MONTH, 7);   
            } else {
                cal.add(Calendar.DAY_OF_MONTH, 1);
            }






        }
    }
}