定义“每月的星期”
首先,您必须清楚“一周中的一周”是什么意思。第 1 周是否包含该月的第一天?是这样吗,星期天什么时候结束?星期六?
还是第 1 周包含第一个星期一?第一个星期日?
TemporalAdjuster
java.time 类包括接口TemporalAdjuster,用于操作日期时间对象以生成另一个对象。
TemporalAdjusters 类(注意复数“s”)提供了几种实现。一种是dayOfWeekInMonth,回答“今年三月的第二个星期二”等问题。
仔细阅读该调节器的课程文档。
ISO 8601
ISO 8601 标准定义了日期时间值的合理文本表示。我建议你坚持使用这些而不是自己编造。
所以,不要使用Dec 2016,而是使用2016-12。
java.time 类默认使用 ISO 8601 格式。比如YearMonth类可以直接解析生成2016-12等值。
YearMonth ym = YearMonth.of( 2016 , 12 );
…或者,为了清楚起见,使用Month 枚举对象…
YearMonth ym = YearMonth.of( 2016 , Month.DECEMBER );
调用toString 生成ISO 8601 格式的字符串。
ym:toString(): 2016-12
YearMonth ym = YearMonth.parse( "2016-12" );
LocalDate 类表示没有时间和时区的仅日期值。 YearMonth 对象可以在该月的第一天和最后一天为您提供 LocalDate。
示例
如果您将一周中的一周定义为从 1 日开始到周日结束,那么请执行以下操作。逐日递增,打印每个月的日期数。测试每个人的星期几,看看它是否是星期的最后一天(根据您自己的定义),因此需要换行。
如果绝对必要,您可以优化此代码。而且您可能需要清理它以不打印最后的逗号。但它会让你朝着正确的方向前进。
YearMonth ym = YearMonth.parse( "2016-12" );
LocalDate firstOfMonth = ym.atDay( 1 );
LocalDate lastOfMonth = ym.atEndOfMonth();
int nthWeek = 1;
LocalDate ld = firstOfMonth;
while( ! ld.isAfter( lastOfMonth ) ) {
System.out.print( ld.getDayOfMonth() + ", " );
if( ld.getDayOfWeek().equals( DayOfWeek.SUNDAY ) ) {
System.out.println( "" ); // Wrap to next line.
}
ld = ld.plusDays( 1 ); // Setup for next loop.
}
System.out.println( "\nDone." );
见live code in IdeOne.com。
1、2、3、4,
5、6、7、8、9、10、11,
12、13、14、15、16、17、18,
19、20、21、22、23、24、25,
26、27、28、29、30、31,
完成。