如何查看星期六/星期日?
此代码所做的是打印本周从周一到周五的日期。它工作正常,但我想问别的:如果今天是星期六或星期天,我希望它显示下周。我怎么做?如何查看星期六/星期日?
这里是我工作的代码到目前为止(感谢*的!!):
// 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)
.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);
}
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
从何处获取java.time类?
-
Java SE 8和SE 9后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
-
Java SE 6和SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
-
Android
- 的ThreeTenABP项目适应ThreeTen-反向移植(上述)为Android特异性。
- 请参阅How to use…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
感谢您的回复!如果我运行它,它说星期几是2(星期天在这里)。所以我已经把它放在那里,并且星期一从3开始....是对的吗? – Cristian 2011-01-09 01:55:23