在Java中,如何将日历增加7天,直到下个月,然后从开始日期算起一年?
这个问题一直困扰着我。我在谷歌上搜索了一下,发现java中的增量是从当前日期开始的,但我希望它从过去的某个日期开始 例如,让我们从以下格式的日期开始: “1986-09-20” 我如何增加天数,使上面的例子变成“1986-09-27”,再增加一次,它就变成“1986-10-4”,一直到该年年底,它变成“1987-01-03” 我知道我可以在当天使用+=7增加日期,如果超过30,则增加月份,但我不知道如何计算30天、31天或2月的闰日 我一直在看Calendar的文档,注意到它可能包含解决方案,但我不知道如何/从哪里开始 我希望结果格式为yyyy-mm-dd,而不是Java日期格式,即日-月-日时区yyy如果可以,请使用。它将使一切变得更加容易,并处理闰年等问题 下面是一个简单的例子:在Java中,如何将日历增加7天,直到下个月,然后从开始日期算起一年?,java,date,calendar,Java,Date,Calendar,这个问题一直困扰着我。我在谷歌上搜索了一下,发现java中的增量是从当前日期开始的,但我希望它从过去的某个日期开始 例如,让我们从以下格式的日期开始: “1986-09-20” 我如何增加天数,使上面的例子变成“1986-09-27”,再增加一次,它就变成“1986-10-4”,一直到该年年底,它变成“1987-01-03” 我知道我可以在当天使用+=7增加日期,如果超过30,则增加月份,但我不知道如何计算30天、31天或2月的闰日 我一直在看Calendar的文档,注意到它可能包含解决方案,但
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = dtf.parseDateTime("1986-09-20");
DateTime result = dateTime.plusDays(7);
System.out.println("Result: " + dtf.print(result));
如果可以,请使用。它将使一切变得更加容易,并处理闰年等问题
下面是一个简单的例子:
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = dtf.parseDateTime("1986-09-20");
DateTime result = dateTime.plusDays(7);
System.out.println("Result: " + dtf.print(result));
以下是您想要的吗
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(1986, 8, 20);
int year = cal.get(Calendar.YEAR);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
while (year >= cal.get(Calendar.YEAR)) {
cal.add(Calendar.DAY_OF_MONTH, 7);
System.out.println(sdf.format(cal.getTime()));
}
输出:
1986-09-271986-10-04
1986-10-11
1986-10-18
1986年10月25日 1986-11-01
1986-11-08
1986-11-15
1986-11-22
1986-11-29
1986-12-06
1986-12-13
1986-12-20
1986-12-27
1987-01-03
以下是您想要的吗
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(1986, 8, 20);
int year = cal.get(Calendar.YEAR);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
while (year >= cal.get(Calendar.YEAR)) {
cal.add(Calendar.DAY_OF_MONTH, 7);
System.out.println(sdf.format(cal.getTime()));
}
输出:
1986-09-271986-10-04
1986-10-11
1986-10-18
1986年10月25日 1986-11-01
1986-11-08
1986-11-15
1986-11-22
1986-11-29
1986-12-06
1986-12-13
1986-12-20
1986-12-27
1987-01-03
其他答案是正确的,但已经过时 字符串!=日期时间 我希望结果格式是yyyy-mm-dd,而不是Java日期格式,即日-月-日时区yyy 您将日期时间值与表示该值的字符串混淆。因此,没有“Java日期格式”这样的东西。您可以生成任意格式的字符串,也可以自动生成本地化格式的字符串 所需的输入字符串是标准格式。默认情况下,java.time类使用这些标准格式 java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
,.Calendar
,&java.text.SimpleDateFormat
。该团队还建议迁移到java.time
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释
大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
,等等
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区
LocalDate start = LocalDate.parse( "1986-09-20" );
这门课可以做数学题,可以根据你的意愿增加年数和周数
显然,您希望从下个月输入日期的第一个星期开始。接口和类(注意复数)提供了这种帮助。特别是,DayOfWeek
对于一周中的七天来说非常方便
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()
循环
您可以通过在各种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 );
}
我建议首先确定边界日期,以保持业务逻辑清晰。然后,每周循环一次,因为这是逻辑附带的。混淆这两个问题(边界日期和每周)会让你的问题变得混乱。其他答案是正确的,但已经过时 字符串!=日期时间 我希望结果格式是yyyy-mm-dd,而不是Java日期格式,即日-月-日时区yyy 您将日期时间值与表示该值的字符串混淆。因此,没有“Java日期格式”这样的东西。您可以生成任意格式的字符串,也可以自动生成本地化格式的字符串 所需的输入字符串是标准格式。默认情况下,java.time类使用这些标准格式 java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
,.Calendar
,&java.text.SimpleDateFormat
。该团队还建议迁移到java.time
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释
大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
,等等
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区
LocalDate start = LocalDate.parse( "1986-09-20" );
这门课可以做数学题,可以根据你的意愿增加年数和周数
显然,您希望从下个月输入日期的第一个星期开始。