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

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

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

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

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

仔细研究java.util.Calendar的文档 。

如果我这样做,我会使用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); } 

或类似的东西。

这样的事情应该有效。

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

这是一个使用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的方式要简单得多。

java.time

Java 8及更高版本附带了新的java.time包。 受JSR 310定义的Joda-Time的启发,由ThreeTen-Extra项目扩展。 这些新类取代了臭名昭着的java.util.Date/.Calendar和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但并不总是因为夏令时等exception。 要对第一个时刻进行软编码,我们要调用在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] 
 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(); } } 

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

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

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

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

 List sundays2014 = Dates.from(2014, 1, 1).to(2014, 12, 31).byWeek().on(DayOfWeek.SUNDAY).build(); for(Date date: sundays2014) { System.out.println(date); } 

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

发明由我和朋友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); } } } }