Android获取前一周的日期

时间:2017-05-22 22:04:39

标签: java android

我有一些代码可以获取当前周并将其加载到数组中:

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。

如何修复我的代码以便在第一次点击时正确检索前几周?

2 个答案:

答案 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/22Sun 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