我有一些代码可以获取当前周并将其加载到数组中:
DateFormat format = new SimpleDateFormat("M-dd");
calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
days = new String[7];
for (int i = 0; i < 7; i++)
{
calendar.add(Calendar.DATE, 1);
days[i] = format.format(calendar.getTime());
}
然后我有一些代码在选择一个按钮时运行,该按钮将检索前一周的日期并将它们加载到一个数组中:
DateFormat format = new SimpleDateFormat("M-dd");
days = new String[7];
for (int i = 0; i < 7; i++)
{
calendar.add(Calendar.DATE, -1);
days[i]=format.format(calendar.getTime());
}
我的问题是它会加载例如:5-22-17,5-23-17,5-24-17,5-25-17,5-26-17,5-27-17,5 -28-17进入第一周的初始加载,然后当我点击我的上一个按钮运行上一个按钮代码时,它只返回1天:5-21-17 - 5-27-17。如果我再次点击它然后再回过头一整周:5-14-17 - 5-20-17。
如何修复我的代码以便在第一次点击时正确检索前几周?
答案 0 :(得分:2)
我认为问题在于calendar
正在前进和后退,而不是被用作锚。此代码显示了处理此情况的一种方法。它保持当前的当前开始,并从该点获得天数。
/**
* Returns 7 days starting from the specified starting date
*/
private static String[] getDays(Calendar starting)
{
DateFormat format = new SimpleDateFormat("M-dd");
String[] days = new String[7];
Calendar mod = Calendar.getInstance();
mod.setTime(starting.getTime());
for (int i = 0; i < days.length; ++i) {
mod.add(Calendar.DATE, 1);
days[i] = format.format(mod.getTime());
}
return days;
}
public static void main(String[] args)
{
// this sets to the beginning of the current week
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.SUNDAY);
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
// need this to back up
Calendar beginningOfWeek = cal;
// generate the array
String days[] = getDays(beginningOfWeek);
System.out.println(Arrays.toString(getDays(beginningOfWeek)));
// go forward one week
beginningOfWeek.add(Calendar.DATE, 7);
System.out.println(Arrays.toString(getDays(beginningOfWeek)));
// go back one week; same as starting
beginningOfWeek.add(Calendar.DATE, -7);
System.out.println(Arrays.toString(getDays(beginningOfWeek)));
// go back one week; one week before we began
beginningOfWeek.add(Calendar.DATE, -7);
System.out.println(Arrays.toString(getDays(beginningOfWeek)));
}
示例输出:
[5-22,5-23,5-24,5-25,5-26,5-27,5-28]
[5-29,5-30,5-31,3-01,6-02,6-03,6-04]
[5-22,5-23,5-24,5-25,5-26,5-27,5-28]
[5-15,5-16,5-17,5-18,5-19,5-20,5-21]
请注意,可以应用多种优化,例如每次调用format
方法时都不创建getDays(...)
。此外,变量名称基本上来自OP,但可能不是最佳的。
答案 1 :(得分:2)
首先,您将星期的第一天设置为星期日,但在获取第一个值之前添加1 ,因此结果为Mon 5/22
到Sun 5/28
,而不是{{1转到Sun 5/21
。
其次,完成第一个循环后,Calendar对象位于Sat 5/27
。然后你倒退,在获得最后一个值之前减去1 ,结果是5/28
down 到5/27
,而不是5/21
到{ {1}}就像你说的那样。
使Calendar对象位于5/21
。重复上述步骤,您将5/27
降为5/21
,而不是5/20
转为5/14
。
因此,要将结果作为星期日到星期六的一周,就像你告诉日历你想要的那样,在之后添加1 获取值。要以正确的顺序获得一周,请始终逐步获得它们。要回到上一周,由于日历在之后,所以你可以回到2周开始构建前一周。
5/14
输出
5/20