如何检查是周六/周日?

Cri*_*ian 26 java calendar

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

到目前为止,这是我的工作代码(感谢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);
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*ell 26

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

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

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1);
Run Code Online (Sandbox Code Playgroud)

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

  • 也许使用'dayOfWeek == Calendar.FRIDAY'优先于'dayOfWeek == 6'等? (7认同)

Bas*_*que 19

TL;博士

核心代码概念:

EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY )           // Instantiate a n 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.
        )
Run Code Online (Sandbox Code Playgroud)

java.time

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

DayOfWeek枚举提供七种对象,周一至周日.

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值.

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

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = today.getDayOfWeek();
Run Code Online (Sandbox Code Playgroud)

将周末定义为一组DayOfWeek对象.请注意,这EnumSet是一种特别快速且低内存的实现,Set旨在保存Enum诸如的对象DayOfWeek.

Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
Run Code Online (Sandbox Code Playgroud)

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

Boolean todayIsWeekend = weekend.contains( dow );
Run Code Online (Sandbox Code Playgroud)

问题说如果这是一个周末,我们想跳到下周的开始.为此,使用一个TemporalAdjuster提供可以操作日期时间对象的类.在java.time中,我们有不可变对象.这意味着我们根据现有对象中的值生成新实例,而不是更改("mutate")原始实例.的TemporalAdjusters类(注意复数的')提供的几个方便的实现方式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 ) );
}
Run Code Online (Sandbox Code Playgroud)

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

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 );
}
Run Code Online (Sandbox Code Playgroud)

请参阅IdeOne.com中的实时代码.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.