其他答案正确但已过时。
字符串 != 日期时间
我希望结果格式为 yyyy-mm-dd 而不是 Java 日期格式,即 Day Month dd time time-zone yyyy
您将日期时间值与表示该值的字符串混淆了。因此,不存在“Java 日期格式”之类的东西。您可以生成任意格式的字符串,或者以本地化格式自动生成。
您想要的输入字符串是标准的ISO 8601 格式。 java.time 类默认使用这些标准格式。
java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如 java.util.Date、.Calendar 和 java.text.SimpleDateFormat。 Joda-Time 团队还建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 等等。
LocalDate
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate start = LocalDate.parse( "1986-09-20" );
这门课可以做数学,根据需要添加年数和周数。
显然,您希望从下个月输入日期的星期几的第一次出现开始。 TemporalAdjuster 接口和TemporalAdjusters 类(注意复数)提供了这样的帮助。特别是TemporalAdjusters.nextOrSame( DayOfWeek ),其中DayOfWeek 是一周中7 天的方便enum。
DayOfWeek dow = start.getDayOfWeek();
LocalDate monthLater = start.plusMonths( 1 ); // If day 29-31 not found in following month, the last day of month is used instead. So always next month, not two months out.
LocalDate firstOfNextMonth = monthLater.withDayOfMonth( 1 );
TemporalAdjuster adjuster = TemporalAdjusters.nextOrSame( dow );
LocalDate firstDayOfWeekOfNextMonth = firstOfNextMonth.with( adjuster );
一年后。
LocalDate yearLaterFromFirstDayOfWeekOfNextMonth = firstDayOfWeekOfNextMonth.plusYears( 1 );
字符串
要生成所需的 ISO 8601 标准格式的字符串,只需调用 toString()。
String output = yearLaterFromFirstDayOfWeekOfNextMonth.toString();
循环
您可以通过使用各种 java.time 类上的 equals、compareTo、isEqual、isBefore 和 isAfter 方法进行测试来循环日期时间值。
LocalDate ld = start;
while ( ! ld.isAfter( firstDayOfWeekOfNextMonth ) ) {
String output = ld.toString();
…
// Prepare for next loop.
ld = ld.plusWeeks( 1 );
}
我建议先确定您的边界日期,以保持业务逻辑清晰。然后每周进行循环,因为这对逻辑来说是附带的。将这两个问题(边界日期和逐周)混合在一起会让您的问题感到困惑。