7

我需要根据作为参数发送的哪一天来获取一周中所有天数(周一到周日)。

例如,
我经过 5 月 2 日,我得到一个数组 [30,1,2,3,4,5,6] 实际上是本周。
或者,我通过 5 月 16 日,我得到一个数组 [14,15,16,17,18,19,20]。

我尝试使用此代码,但它从今天起 7 天返回,这是我不想要的。

        //get which week of month
        Calendar now = Calendar.getInstance();
        now.set(mYear, mMonth, Integer.parseInt(extractedDay));
        int weekOfMonth = now.get(Calendar.WEEK_OF_MONTH);

        //get all days of clicked week
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.set(mYear, mMonth, Integer.parseInt(extractedDay));

        String[] days = new String[7];
        for (int i = 0; i < 7; i++)
        {
            days[i] = format.format(calendar.getTime());
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }

但这不是我需要的。我需要通过今天(星期四)并获得 5 月这一周的日期 - 4 月 30 日星期一到 5 月 6 日星期日。

编辑

我意识到我有一个代码可以检测一个月中的哪一周。有没有办法使用这些数据并设置星期一的日期?例如,我通过了 5 月 16 日,然后我检测到它是 5 月的第 3 周,并且我将变量firstDayOfWeek(一个新变量)设置为 5 月 14 日。

4

4 回答 4

21

您必须首先减去您选择的工作日,以便从一周的第一天开始。试试下面的代码:

public static void main(String[] args){
    Calendar now = Calendar.getInstance();

    SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

    String[] days = new String[7];
    int delta = -now.get(GregorianCalendar.DAY_OF_WEEK) + 2; //add 2 if your week start on monday
    now.add(Calendar.DAY_OF_MONTH, delta );
    for (int i = 0; i < 7; i++)
    {
        days[i] = format.format(now.getTime());
        now.add(Calendar.DAY_OF_MONTH, 1);
    }
    System.out.println(Arrays.toString(days));

}

今天,它输出:

[04/30/2012, 05/01/2012, 05/02/2012, 05/03/2012, 05/04/2012, 05/05/2012, 05/06/2012]

于 2012-05-03T10:46:32.823 回答
7

你的问题已经回答了,但我想补充一点。您的代码在两个方面存在问题:

  1. 它使用各种数据类型作为初始日期(mYearisintexactDayis String?)。
  2. 它混合了结果的解析、格式化和生成。

这使您很难测试代码!

因此,我提出了一种不同的方法:

public class DaysOfCurrentWeek {
    public static void main(String[] args) {
        Date refDate = new Date();

        Date[] days = getDaysOfWeek(refDate, Calendar.getInstance().getFirstDayOfWeek());

        for (Date day : days) {
            System.out.println(day);
        }
    }

    private static Date[] getDaysOfWeek(Date refDate, int firstDayOfWeek) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(refDate);
        calendar.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
        Date[] daysOfWeek = new Date[7];
        for (int i = 0; i < 7; i++) {
            daysOfWeek[i] = calendar.getTime();
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        return daysOfWeek;
    }
}

代码是这样工作的:

  1. 创建一个参考日期(在本例中仅使用new Date())。
  2. 打电话getDaysOfWeek()去做“肮脏的工作”。通过传递,firstDayOfWeek您可以自由选择MONDAYSUNDAY作为一周的开始。在这个例子中,我只使用默认的日历。
  3. 返回结果 - 未格式化,并作为Date. 这样,您可以让调用代码决定要做什么——打印它或做一些进一步的计算。

现在您可以简单地测试 getDaysOfWeek() 方法,而无需担心格式或参考日期是如何创建的。

于 2012-05-03T11:15:12.580 回答
1

您将需要在当前代码的某处使用这行代码:

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

它至少应该在 for 循环之前。

于 2012-05-03T10:26:16.550 回答
0

您需要在设置日期设置日期

calendar.set(mYear, mMonth, Integer.parseInt(extractedDay)); calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

于 2012-05-03T10:41:05.343 回答