java - 如何在 Java 中将日历增加 7 天直到下个月,然后从开始日期开始一年?

标签 java date calendar

这个问题一直困扰着我。我用谷歌搜索了一下,发现 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 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter 等。

本地日期

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();

循环

您可以通过使用 equalscompareToisEqualisBeforeisBefore 进行测试来循环日期时间值在各种 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/

相关文章:

java - 使用 maven-resources-plugin 过滤时如何阻止反斜杠被转义?

javafx 在新选项卡中动态打开新的 fxml 文件

java - 推理变量 T 具有不兼容的边界错误

php - 在 JavaScript 中将字符串转换为 Date()

mysql - phpMyAdmin 中的德国日期?

swift - 如何使用日期或日历更改UITextView中的值?

Java日历添加小时问题以毫秒为单位获取时间

java - 在 JDBC 中使用日历对象

javascript - 在日历应用程序中查找从哪里开始计数

java - JavaFX 中的控制台面板