如何获得前几周



如何按日期全周,我这样做

  calendar.add(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() - calendar.get(Calendar.DAY_OF_WEEK));
    String[] weekly = new String[7];
    Arrays.fill(weekly, "");
    int today = calendar.getInstance().get(Calendar.DAY_OF_WEEK);
    for (int i = 0; i < 7; i++) {
        Date dt = calendar.getTime ();
        // now format it using SimpleDateFormat
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
        String val = df.format (dt);
        weekly[i] = val;
        calendar.add (Calendar.DAY_OF_WEEK, 2);
        Log.d("valueweek",""+weekly[i]);
    }

输出

26-11-2017

27-11-2017

28-11-2017

29-11-2017

30-11-2017

01-12-2017

02-12-2017

,但我也想要本月的所有前几周

java.time

首先,请考虑删除长期过时的类CalendarDateDateFormat。今天,我们在java.time(现代Java日期和时间API)中也有更好的选择,也称为JSR-310。在Android上,我也会回到这一点。现代API可以使用得更好。

如果我正确理解您的请求,这应该给您您想要的东西:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
    WeekFields localWeekFields = WeekFields.of(Locale.getDefault());
    LocalDate today = LocalDate.now(ZoneId.of("Europe/Helsinki"));
    Month thisMonth = today.getMonth();
    LocalDate weekStart = today.withDayOfMonth(1)
            .with(TemporalAdjusters.previousOrSame(localWeekFields.getFirstDayOfWeek()));
    // Iterate over weeks
    do {
        System.out.println("Here’s a week:");
        // Iterate over days in week
        LocalDate day = weekStart;
        for (int i = 0; i < 7; i++) {
            System.out.println(day.format(dateFormatter));
            day = day.plusDays(1);
        }
        weekStart = weekStart.plusWeeks(1);
    } while (weekStart.getMonth().equals(thisMonth));

今天在我的计算机上运行此片段,它打印了5周的日子,所以我只会向您展示第一行和最后一行:

Here’s a week:
30-10-2017
31-10-2017
01-11-2017
02-11-2017
…
Here’s a week:
27-11-2017
28-11-2017
29-11-2017
30-11-2017
01-12-2017
02-12-2017
03-12-2017

由于在我的地区开始,一周是从星期一开始的,因此从星期一到周日进行。如果您在周日是本周第一天的环境中运行相同的代码,则应从周日到星期六。

一点解释:WeekFields.of(Locale.getDefault())为我们提供了当前语言环境的WeekFields对象。我们使用几行来确定一周的第一天。然后,我们在您所需的时区查询今天的日期 - 如果您不想要欧洲/赫尔辛基,请填写所需的时区。要迭代几周,我们将LocalDate初始化为第一周的第一天,到了本月的第一天,然后回到本周的第一天(可能进入上个月)。为了确定哪个是一周的第一天,我们查询WeekFields对象,这些对象较早地将其作为当前语言环境的一条线(如果需要的话,您可以填充其他位置,或者只是其他WeekFields对象)。

在几周的循环中,我们首先打印一周,然后在weekStart中加一周,因此我们已经准备好下周了。循环条件是我们在本月内。为了确保循环即使在上个月的最后几天开始进行第一次迭代,我使用do -while循环,而不是while循环。

此功能在Android上工作?

您当然也可以在Android上使用现代API。您需要将现代API的返回到Android(这是JSR-310的Threeten,Android Backport的ABP)。在这个问题中,一切都很好,并且对:如何在Android项目中使用Threetenabp。

最新更新