获取本周的所有日子?

时间:2012-05-03 10:15:31

标签: java

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

例如,
我通过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);
        }

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

修改

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

4 个答案:

答案 0 :(得分:20)

您必须先减去所选日期的工作日,才能从一周的第一天开始。请尝试以下代码:

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]

答案 1 :(得分:5)

您的问题已经得到解答,但我想补充一下。您的代码在两个方面存在问题:

  1. 它使用各种数据类型作为初始日期(mYearintexactDayString?)。
  2. 它混合了解析,格式化和生成结果。
  3. 这使您难以测试代码!

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

    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。这样你就可以让调用代码决定做什么 - 打印它或做进一步的计算。
    4. 现在您可以简单地测试getDaysOfWeek()方法,而无需担心格式化或参考日期的创建方式。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

您需要设置日期 后设置日期

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