这个问题一直困扰着我。我用谷歌搜索了一下,发现 java 从当前日期开始增加,但我希望它从过去的某个日期开始。
例如,让我们从以下格式的日期开始:
“1986-09-20”
如何增加天数,使上面的示例变成“1986-09-27”,再增加一次,它就变成“1986-10-4”,直到年底变成“1987-01-03"
我知道我可以在当天使用 += 7 来增加日期,如果超过 30,则增加月份,但我不知道如何解释 30 或 31 或二月的闰日日。
我一直在查看日历的文档,并注意到它可能包含解决方案,但我不知道如何/从哪里开始。
我希望结果格式为 yyyy-mm-dd 而不是 Java 日期格式,即日月 dd 时间时区 yyyy
最佳答案
其他答案是正确的,但已过时。
字符串!=日期时间
I want to result format to be yyyy-mm-dd NOT the Java date format which is 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 future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
、YearWeek
、YearQuarter
等。
本地日期
LocalDate
类表示仅日期值,没有时间和时区。
LocalDate start = LocalDate.parse( "1986-09-20" );
这门课可以做数学,根据需要添加年和周。
显然您想从下个月输入日期的星期几第一次出现开始。 TemporalAdjuster
接口(interface)和TemporalAdjusters
类(注意复数)提供这样的帮助。特别是TemporalAdjusters.nextOrSame( DayOfWeek )
其中 DayOfWeek
是一个方便的 enum一周中的 7 天。
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();
循环
您可以通过使用 equals
、compareTo
、isEqual
、isBefore
和 isBefore
进行测试来循环日期时间值在各种 java.time 类上找到的 isAfter
方法。
LocalDate ld = start;
while ( ! ld.isAfter( firstDayOfWeekOfNextMonth ) ) {
String output = ld.toString();
…
// Prepare for next loop.
ld = ld.plusWeeks( 1 );
}
我建议首先确定边界日期,以保持业务逻辑清晰。然后每周进行循环,因为这对于逻辑来说是偶然的。混合这两个问题(边界日期和每周)会让您的问题变得困惑。
关于java - 如何在 Java 中将日历增加 7 天直到下个月,然后从开始日期开始一年?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38857931/