如何按日期全周,我这样做
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
首先,请考虑删除长期过时的类Calendar
,Date
和DateFormat
。今天,我们在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。