如何查看星期六/星期日?

问题描述:

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

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

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

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

+0

感谢您的回复!如果我运行它,它说星期几是2(星期天在这里)。所以我已经把它放在那里,并且星期一从3开始....是对的吗? – Cristian 2011-01-09 01:55:23

TL;博士

核心代码的概念:

EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY) 
     .contains( 
      LocalDate.now(ZoneId.of("America/Montreal")) 
        .getDayOfWeek() 
     ) 

java.time

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

DayOfWeek枚举为星期一至星期日提供了七个对象。

LocalDate类代表没有时间和不带时区的仅有日期的值。

时区对确定日期至关重要。对于任何特定的时刻,日期因地区而异。例如,Paris France午夜后几分钟是新的一天,而在Montréal Québec仍然是“昨天”。

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

将周末定义为一组DayOfWeek对象。请注意,EnumSet是一个特别快速和低内存的实现Set旨在容纳Enum对象,如DayOfWeek

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

现在我们可以测试今天是星期几还是周末。

Boolean todayIsWeekend = weekend.contains(dow); 

该问题表示,如果这是一个周末,我们希望跳到下周开始。为此,请使用TemporalAdjuster,它提供可以操作日期 - 时间对象的类。在java.time中我们有immutable objects。这意味着我们根据现有对象内的值生成新实例,而不是修改原始对象(“变异”)。 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)); 
} 

我们软编码一周的长度,以防我们的周末定义发生变化。

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

参见live code in IdeOne.com


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore