如何检查是周六/周日?

此代码的作用是打印当周从星期一到星期五的日期。 它工作正常,但我想问别的:如果今天是星期六或星期日,我希望它显示下周。 我怎么做?

到目前为止,这是我的工作代码(感谢StackOverflow !!):

// Get calendar set to current date and time Calendar c = Calendar.getInstance(); // Set the calendar to monday of the current week c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // Print dates of the current week starting on Monday to Friday DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy"); for (int i = 0; i <= 4; i++) { System.out.println(df.format(c.getTime())); c.add(Calendar.DATE, 1); } 

非常感谢! 我真的很感激,因为我一直在寻找解决方案……

 public static void main(String[] args) { Calendar c = Calendar.getInstance(); // Set the calendar to monday of the current week c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // Print dates of the current week starting on Monday to Friday DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy"); for (int i = 0; i <= 10; i++) { System.out.println(df.format(c.getTime())); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); if (dayOfWeek == Calendar.FRIDAY) { // If it's Friday so skip to Monday c.add(Calendar.DATE, 3); } else if (dayOfWeek == Calendar.SATURDAY) { // If it's Saturday skip to Monday c.add(Calendar.DATE, 2); } else { c.add(Calendar.DATE, 1); } // As Cute as a ZuZu pet. //c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1); } } 

产量

 Mon 03/01/2011 Tue 04/01/2011 Wed 05/01/2011 Thu 06/01/2011 Fri 07/01/2011 Mon 10/01/2011 Tue 11/01/2011 Wed 12/01/2011 Thu 13/01/2011 Fri 14/01/2011 Mon 17/01/2011 

如果你想变得可爱,你可以用if / then / else替换

 c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1); 

但我真的想要一些容易理解和可读的东西。

TL;博士

核心代码概念:

 EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) // Instantiate an implementation of `Set` highly optimized in both memory usage and execution speed for collecting enum objects. .contains( // Ask if our target `DayOfWeek` enum object is in our `Set`. LocalDate.now( ZoneId.of( "America/Montreal" ) ) // Determine today's date as seen by the people of a particular region (time zone). .getDayOfWeek() // Determine the `DayOfWeek` enum constant representing the day-of-week of this date. ) 

java.time

现代的方法是使用java.time类。

DayOfWeek枚举为周一至周日提供七个对象。

LocalDate类表示没有时间且没有时区的仅日期值。

时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。

 ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z ); DayOfWeek dow = today.getDayOfWeek(); 

将周末定义为一组DayOfWeek对象。 请注意, EnumSetSet一种特别快速且低内存的实现,旨在保存Enum对象,例如DayOfWeek

 Set weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ); 

现在我们可以测试今天是工作日还是周末。

 Boolean todayIsWeekend = weekend.contains( dow ); 

该问题说,如果这是一个周末,我们想跳到下周的开始。 为此,请使用TemporalAdjuster ,它提供可以操作日期时间对象的类。 在java.time中,我们有不可变对象 。 这意味着我们基于现有对象中的值生成新实例,而不是改变(“改变”)原始实例。 TemporalAdjusters类(注意复数的’s’)提供了几个方便的TemporalAdjuster实现,包括next( DayOfWeek )

 DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ; LocalDate startOfWeek = null ; if( todayIsWeekend ) { startOfWeek = today.with( TemporalAdjusters.next( firstDayOfWeek ) ); } else { startOfWeek = today.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) ); } 

如果周末的定义发生变化,我们会对本周的长度进行软编码。

 LocalDate ld = startOfWeek ; int countDaysToPrint = ( DayOfWeek.values().length - weekend.size() ); for( int i = 1 ; i <= countDaysToPrint ; i++ ) { System.out.println( ld ); // Set up the next loop. ld = ld.plusDays( 1 ); } 

查看IdeOne.com中的实时代码 。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参阅如何使用....

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。