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

时间:2015-07-30 06:51:20

标签: java date calendar

所以,我有一个用户可以选择日期的应用程序。

他可以选择的最长日期是距离当前日期多7天。

现在,我只显示当月的日历。如果当前日期是7月30日,则必须为用户提供选择日期至8月6日的选项,同时我必须处理年度变化的情况,即12月30日,15日是当前日期,+ 7天是1月6日,16日

以下是我用于获取当月所有日期的代码。我该怎么做才能让它适用于上述场景。

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

代码:

pathUri = Uri.fromFile(new File(path));
Picasso.with(c).load(pathUri).resize(dpToPx(80), dpToPx(80)).centerCrop().into(holder.foto);

当前O / p:

   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

2 个答案:

答案 0 :(得分:2)

只需在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的Time API或Joda-Time超过Calendar

答案 1 :(得分:0)

对象,而不是字符串

使用对象来表示日期,而不是依赖于字符串。生成字符串仅用于呈现给用户,但内部跟踪数据作为对象。

java.time.LocalDate

问题和其他答案使用麻烦的旧遗留日期时间类。避免他们。现在取代了java.time类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

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

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类可以自动本地化生成的字符串。为缩写长度指定FormatStyle。指定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及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。