如何获得有关日期的所有星期几周,我这样做
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日
但我也想要本月的前几周
答案 0 :(得分:1)
java.time
首先,请考虑删除过时的类Calendar
,Date
和DateFormat
。今天我们在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上使用现代API。你需要获得ThreeTenABP,这是Android现代API的后端(对于JSR-310来说是ThreeTen,对于Android Backport来说是ABP)。在this question: How to use ThreeTenABP in Android Project中完全解释了这一点。