如何获得前几周

时间:2017-11-29 14:45:34

标签: android calendar android-calendar

如何获得有关日期的所有星期几周,我这样做

  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

2017年1月12日

2017年2月12日

但我也想要本月的前几周

1 个答案:

答案 0 :(得分:1)

java.time

首先,请考虑删除过时的类CalendarDateDateFormat。今天我们在java.time, the modern Java date and time API also known as 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循环。< / p>

这适用于Android吗?

您当然也可以在Android上使用现代API。你需要获得ThreeTenABP,这是Android现代API的后端(对于JSR-310来说是ThreeTen,对于Android Backport来说是ABP)。在this question: How to use ThreeTenABP in Android Project中完全解释了这一点。