你的问题不太清楚,但显然你想找到每个月最后一天恰好是星期一的所有情况。
java.time
现代方法使用
java.time类。具体来说,
LocalDate
类表示仅包含日期值而不包含时间和时区的日期。此外,
Year
、
YearMonth
和
DayOfWeek
类也是如其名称所示。
与其传递简单的整数,您可以传递
Year
对象以实现类型安全,使您的代码更加自我说明。
Year startYear = Year.of( 2016 );
Year stopYear = Year.of( 2018 );
定义你的实用方法。
public List< LocalDate > calcMondays ( Year startYear , Year stopYear ) { … }
传递那一对对象。
List< LocalDate> dates = this.calcMondays( startYear , stopYear )
我建议在定义时间跨度时始终使用半开放方法。在这种方法中,开始时间是包含的,而结束时间是不包含的。因此,2017-2019年的时间段将从2017年的第一天开始,并持续到但不包括2019年的第一天,为期2年。
获取YearMonth
的开始和停止时间,表示整个月。
YearMonth startYm = YearMonth.from( startYear.atDay( 1 ) ) ;
YearMonth stopYm = YearMonth.from( stopYear.atDay( 1 ) ) ;
定义一个包含我们找到的日期的集合。
int initialCapacity = ( int ) ChronoUnit.MONTHS.between( startYear.atDay( 1 ) , stopYear.atDay( 1 ) );
List< LocalDate > lastMondays = new ArrayList<>( initialCapacity ) ;
定义我们要定位的星期几。使用DayOfWeek
枚举。
DayOfWeek dow = DayOfWeek.MONDAY ;
定义一个TemporalAdjuster
,使用在TemporalAdjusters
类中找到的实现。
TemporalAdjuster ta = TemporalAdjusters.lastInMonth( dow )
循环遍历月份。对于每个月份,确定第一个星期一。使用在
TemporalAdjusters
类中找到的
TemporalAdjuster
实现。
YearMonth ym = startYm ;
while( ym.isBefore( stopYm ) ) {
LocalDate firstOfMonth = ym.atDay( 1 ) ;
LocalDate ld = firstOfMonth.with( ta ) ;
lastMondays.add( ld ) ;
ym = ym.plusMonths( 1 ) ;
}
报告。
System.out.println( lastMondays ) ;
请查看在IdeOne.com上代码运行实况。
[2016-01-25,2016-02-29,2016-03-28,2016-04-25,2016-05-30,2016-06-27,2016-07-25,2016-08-29,2016-09-26,2016-10-31,2016-11-28,2016-12-26,2017-01-30,2017-02-27,2017-03-27,2017-04-24,2017-05-29,2017-06-26,2017-07-31,2017-08-28,2017-09-25,2017-10-30,2017-11-27,2017-12-25]
现在让我们修改这个循环,只关注月份的最后一天是星期一的情况。
YearMonth ym = startYm;
while ( ym.isBefore( stopYm ) ) {
LocalDate endOfMonth = ym.atEndOfMonth();
if ( endOfMonth.getDayOfWeek().equals( dow ) ) {
lastMondays.add( endOfMonth );
}
ym = ym.plusMonths( 1 );
}
请查看在IdeOne.com上运行的代码实时运行。
[2016-02-29,2016-10-31,2017-07-31]
请注意这些结果与问题中给出的结果不同。我已经验证这里的结果是正确的,而问题的结果是错误的。
关于 java.time
java.time 框架是内置于 Java 8 及更高版本的。这些类取代了旧的 遗留 日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
想要了解更多,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也不需要 java.sql.*
类。
如何获取 java.time 类?
ThreeTen-Extra项目通过添加额外的类来扩展java.time。该项目是java.time可能未来增加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和更多。
date.setDate(date.getDate() - 1);
并检查date.getDay() === 2
。 - pawelendDate = new Date(endYear, 11, 32)
?那将是次年的1月1日。 - RobGjava.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程。 - Basil Bourque