如何从日历中获取接下来 7 天的日期 java

How to get dates for next seven days from calendar java

所以,我有一个用户可以 select 约会的应用程序。

他可以 select 的最大日期是距当前日期最多 7 天。

现在,我只显示当月的日历。如果当前日期是 7 月 30 日,那么必须为用户提供一个选项,以 select 日期到 8 月 6 日,我还必须处理年份变化的情况,即 12 月 30 日,15 日是当前日期,+7 天提供2016 年 1 月 6 日

下面是我用来获取当月所有天数的代码。我应该怎么做才能让它适用于上述情况。

注意:我总是有可用的当前日期。

代码:

   public class Cals {

        public static void main(String args[])
        {
            Calendar start = Calendar.getInstance();
            start.set(Calendar.DAY_OF_MONTH, Calendar.getInstance()
                    .getActualMinimum(Calendar.DAY_OF_MONTH));
            Calendar end = Calendar.getInstance();
            end.set(Calendar.DAY_OF_MONTH,
                    Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH));
            Calendar now = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("EEE d MMM");

            for (Date dt = start.getTime(); !start.after(end); start.add(
                    Calendar.DATE, 1), dt = start.getTime()) {

                System.out.println(sdf.format(dt));
            }
        }
    }

当前O/p:

Wed 1 Jul
Thu 2 Jul
Fri 3 Jul
Sat 4 Jul
Sun 5 Jul
Mon 6 Jul
Tue 7 Jul
Wed 8 Jul
Thu 9 Jul
Fri 10 Jul
Sat 11 Jul
Sun 12 Jul
Mon 13 Jul
Tue 14 Jul
Wed 15 Jul
Thu 16 Jul
Fri 17 Jul
Sat 18 Jul
Sun 19 Jul
Mon 20 Jul
Tue 21 Jul
Wed 22 Jul
Thu 23 Jul
Fri 24 Jul
Sat 25 Jul
Sun 26 Jul
Mon 27 Jul
Tue 28 Jul
Wed 29 Jul
Thu 30 Jul
Fri 31 Jul

预期 O/p:

Wed 1 Jul
Thu 2 Jul
Fri 3 Jul
Sat 4 Jul
Sun 5 Jul
Mon 6 Jul
Tue 7 Jul
Wed 8 Jul
Thu 9 Jul
Fri 10 Jul
Sat 11 Jul
Sun 12 Jul
Mon 13 Jul
Tue 14 Jul
Wed 15 Jul
Thu 16 Jul
Fri 17 Jul
Sat 18 Jul
Sun 19 Jul
Mon 20 Jul
Tue 21 Jul
Wed 22 Jul
Thu 23 Jul
Fri 24 Jul
Sat 25 Jul
Sun 26 Jul
Mon 27 Jul
Tue 28 Jul
Wed 29 Jul
Thu 30 Jul
Fri 31 Jul
Sat 1 Aug
Sun 2 Aug
Mon 3 Aug
Tue 4 Aug
Wed 5 Aug
Thu 6 Aug

只需将 end Calendar

添加 7 天
Calendar end = Calendar.getInstance();
end.set(Calendar.DAY_OF_MONTH,
                Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH));
end.add(Calendar.DATE, 7);

Calendar 将自动处理翻转

新输出...

Wed 1 Jul
Thu 2 Jul
Fri 3 Jul
Sat 4 Jul
Sun 5 Jul
Mon 6 Jul
Tue 7 Jul
Wed 8 Jul
Thu 9 Jul
Fri 10 Jul
Sat 11 Jul
Sun 12 Jul
Mon 13 Jul
Tue 14 Jul
Wed 15 Jul
Thu 16 Jul
Fri 17 Jul
Sat 18 Jul
Sun 19 Jul
Mon 20 Jul
Tue 21 Jul
Wed 22 Jul
Thu 23 Jul
Fri 24 Jul
Sat 25 Jul
Sun 26 Jul
Mon 27 Jul
Tue 28 Jul
Wed 29 Jul
Thu 30 Jul
Fri 31 Jul
Sat 1 Aug
Sun 2 Aug
Mon 3 Aug
Tue 4 Aug
Wed 5 Aug
Thu 6 Aug
Fri 7 Aug

Calendar 也能够处理年度翻转,例如...

Calendar start = Calendar.getInstance();
start.set(2015, Calendar.DECEMBER, 25);
start.set(Calendar.DAY_OF_MONTH, Calendar.getInstance()
                .getActualMinimum(Calendar.DAY_OF_MONTH));
Calendar end = Calendar.getInstance();
end.setTime(start.getTime());
end.set(Calendar.DAY_OF_MONTH,
                Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH));
end.add(Calendar.DATE, 7);

Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE d MMM yyyy");

for (Date dt = start.getTime(); !start.after(end); start.add(
                Calendar.DATE, 1), dt = start.getTime()) {

    System.out.println(sdf.format(dt));
}

在这里,我将开始日期设置为 12 月,现在输出为...

Tue 1 Dec 2015
Wed 2 Dec 2015
Thu 3 Dec 2015
Fri 4 Dec 2015
Sat 5 Dec 2015
Sun 6 Dec 2015
Mon 7 Dec 2015
Tue 8 Dec 2015
Wed 9 Dec 2015
Thu 10 Dec 2015
Fri 11 Dec 2015
Sat 12 Dec 2015
Sun 13 Dec 2015
Mon 14 Dec 2015
Tue 15 Dec 2015
Wed 16 Dec 2015
Thu 17 Dec 2015
Fri 18 Dec 2015
Sat 19 Dec 2015
Sun 20 Dec 2015
Mon 21 Dec 2015
Tue 22 Dec 2015
Wed 23 Dec 2015
Thu 24 Dec 2015
Fri 25 Dec 2015
Sat 26 Dec 2015
Sun 27 Dec 2015
Mon 28 Dec 2015
Tue 29 Dec 2015
Wed 30 Dec 2015
Thu 31 Dec 2015
Fri 1 Jan 2016
Sat 2 Jan 2016
Sun 3 Jan 2016
Mon 4 Jan 2016
Tue 5 Jan 2016
Wed 6 Jan 2016
Thu 7 Jan 2016

欢迎来到 2016 年:)

我还鼓励您使用 Java 8's Time API 或 Joda-Time 而不是 Calendar

对象,不是字符串

使用对象来表示您的日期,而不是依赖于字符串。生成字符串仅用于向用户展示,但在内部将您的数据作为对象进行跟踪。

java.time.LocalDate

问题和其他答案使用麻烦的旧旧日期时间 classes。避开他们。现在被 java.time classes.

取代

LocalDate

LocalDate class 表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定时刻,日期在全球范围内因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );

通过调用 withDayOfMonth 获取本月的第一天。

LocalDate firstOfCurrentMonth = today.withDayOfMonth( 1 ); // Get first of this month.

获取比今天晚一周的日期。

LocalDate weekLaterThanToday = today.plusWeeks( 1 );

收集 firstOfCurrentMonthweekLaterThanToday 之间的所有可能日期。请注意,通常使用半开方法跟踪时间跨度是有意义的,其中开始是 包含 并且结束是 不包含 。所以我们 不是 为您收集 LocalDate 对象,即今天后的第 7 天。

我们可以将集合的初始容量设置为时间跨度中的天数。使用 ChronoUnit 枚举计算天数。

int countDays = ChronoUnit.DAYS.between( firstOfCurrentMonth , weekLaterThanToday ) ;
List<LocalDate> dates = new ArrayList<>( countDays );
LocalDate ld = firstOfCurrentMonth;
while ( ld.isBefore( weekLaterThanToday ) ) {
    dates.add( ld );
    // Prepare for next loop.
    ld = ld.plusDays( 1 ); // Handles intelligently end-of-month, Leap Year, end-of-year, and so on.
}

您可以循环该集合以生成用于演示的文本。 DateTimeFormatter class can automatically localize the generated string. Specify a FormatStyle for length of abbreviation. Specify a Locale 确定 (a) 用于翻译日名、月名等的人类语言,以及 (b) 决定缩写、大写、标点符号等问题的文化规范。

Locale l = Locale.CANADA_FRENCH ; // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ) ; 

循环您的 LocalDate 对象,要求每个对象生成其值的字符串表示形式。

for( LocalDate ld : dates ) {
    String output = ld.format( f );
}

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些 classes 取代了麻烦的旧日期时间 classes,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time project, now in maintenance mode,建议迁移到java.time。

要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 中搜索许多示例和解释。

许多 java.time 功能被反向移植到 ThreeTen-Backport and further adapted to Android in ThreeTenABP (see 中的 Java 6 和 7)。

ThreeTen-Extra 项目用额外的 class 扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可能会在这里找到一些有用的 classes,例如 IntervalYearWeekYearQuarter 等。