Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何将日历增加7天,直到下个月,然后从开始日期算起一年?_Java_Date_Calendar - Fatal编程技术网

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

在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的文档,注意到它可能包含解决方案,但

这个问题一直困扰着我。我在谷歌上搜索了一下,发现java中的增量是从当前日期开始的,但我希望它从过去的某个日期开始

例如,让我们从以下格式的日期开始:

“1986-09-20”

我如何增加天数,使上面的例子变成“1986-09-27”,再增加一次,它就变成“1986-10-4”,一直到该年年底,它变成“1987-01-03”

我知道我可以在当天使用+=7增加日期,如果超过30,则增加月份,但我不知道如何计算30天、31天或2月的闰日

我一直在看Calendar的文档,注意到它可能包含解决方案,但我不知道如何/从哪里开始

我希望结果格式为yyyy-mm-dd,而不是Java日期格式,即日-月-日时区yyy

如果可以,请使用。它将使一切变得更加容易,并处理闰年等问题

下面是一个简单的例子:

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-27
1986-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-27
1986-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" );
这门课可以做数学题,可以根据你的意愿增加年数和周数

显然,您希望从下个月输入日期的第一个星期开始。