1. 程式人生 > >java 使用Calendar類計算每月有多少自然周,並輸出每週的開始和結束日期

java 使用Calendar類計算每月有多少自然周,並輸出每週的開始和結束日期

思路:首先是獲取該月的實際天數,然後從1號遍歷直至該月最後一天,利用Calendar類找出該日是一週中的第幾天,

(1)若該日是週日,則視為一週結束,並用該日期減去6找到該周的開始日期,若相減結果小於等於1,則說明該周起始日期應該是本月1號。

(1)若該日不是週日,且是該月最後一天,則應該在上面計算的基礎上再加一週,視月末為該周的結束日,該周起始日期應為改日期減去改日

在一週中的位置加2,例如:2013-09-30號是週一,則視為9月份中的第六週,開始日期是30-2+2

提示:Calendar 類中視週日為一週的開始,值是1

示例程式碼:

public static void printfWeeks(String date) throws Exception {
        // String date = "2013-09";
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
        Date date1 = dateFormat.parse(date);
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date1);
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("days:" + days);
        int count = 0;
        for (int i = 1; i <= days; i++) {
            DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
            Date date2 = dateFormat1.parse(date + "-" + i);
            calendar.clear();
            calendar.setTime(date2);
            int k = new Integer(calendar.get(Calendar.DAY_OF_WEEK));
            if (k == 1) {// 若當天是週日
                count++;
                System.out.println("-----------------------------------");
                System.out.println("第" + count + "周");
                if (i - 6 <= 1) {
                    System.out.println("本週開始日期:" + date + "-" + 1);
                } else {
                    System.out.println("本週開始日期:" + date + "-" + (i - 6));
                }
                System.out.println("本週結束日期:" + date + "-" + i);
                System.out.println("-----------------------------------");
            }
            if (k != 1 && i == days) {// 若是本月最好一天,且不是週日
                count++;
                System.out.println("-----------------------------------");
                System.out.println("第" + count + "周");
                System.out.println("本週開始日期:" + date + "-" + (i - k + 2));
                System.out.println("本週結束日期:" + date + "-" + i);
                System.out.println("-----------------------------------");
            }
        }
    }

測試程式碼:

public static void main(String[] args) throws Exception {
        String s = "2013-";
        for (int i = 1; i <= 12; i++) {
            System.out.println("*******************************************");
            System.out.println("月份:" + i);
            printfWeeks(s + i);
            System.out.println("*******************************************");

        }
//        printfWeeks(s + 2);
    } 

輸出結果:

******************************************* 
月份:1 
days:31 
----------------------------------- 
第1周 
本週開始日期:2013-1-1 
本週結束日期:2013-1-6 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-1-7 
本週結束日期:2013-1-13 
----------------------------------- 
----------------------------------- 

第3周 
本週開始日期:2013-1-14 
本週結束日期:2013-1-20 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-1-21 
本週結束日期:2013-1-27 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-1-28 
本週結束日期:2013-1-31 
----------------------------------- 
******************************************* 
******************************************* 
月份:2 
days:28 
----------------------------------- 
第1周 
本週開始日期:2013-2-1 
本週結束日期:2013-2-3 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-2-4 
本週結束日期:2013-2-10 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-2-11 
本週結束日期:2013-2-17 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-2-18 
本週結束日期:2013-2-24 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-2-25 
本週結束日期:2013-2-28 
----------------------------------- 
******************************************* 
******************************************* 
月份:3 
days:31 
----------------------------------- 
第1周 
本週開始日期:2013-3-1 
本週結束日期:2013-3-3 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-3-4 
本週結束日期:2013-3-10 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-3-11 
本週結束日期:2013-3-17 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-3-18 
本週結束日期:2013-3-24 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-3-25 
本週結束日期:2013-3-31 
----------------------------------- 
******************************************* 
******************************************* 
月份:4 
days:30 
----------------------------------- 
第1周 
本週開始日期:2013-4-1 
本週結束日期:2013-4-7 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-4-8 
本週結束日期:2013-4-14 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-4-15 
本週結束日期:2013-4-21 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-4-22 
本週結束日期:2013-4-28 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-4-29 
本週結束日期:2013-4-30 
----------------------------------- 
******************************************* 
******************************************* 
月份:5 
days:31 
----------------------------------- 
第1周 
本週開始日期:2013-5-1 
本週結束日期:2013-5-5 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-5-6 
本週結束日期:2013-5-12 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-5-13 
本週結束日期:2013-5-19 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-5-20 
本週結束日期:2013-5-26 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-5-27 
本週結束日期:2013-5-31 
----------------------------------- 
******************************************* 
******************************************* 
月份:6 
days:30 
----------------------------------- 
第1周 
本週開始日期:2013-6-1 
本週結束日期:2013-6-2 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-6-3 
本週結束日期:2013-6-9 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-6-10 
本週結束日期:2013-6-16 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-6-17 
本週結束日期:2013-6-23 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-6-24 
本週結束日期:2013-6-30 
----------------------------------- 
******************************************* 
******************************************* 
月份:7 
days:31 
----------------------------------- 
第1周 
本週開始日期:2013-7-1 
本週結束日期:2013-7-7 
----------------------------------- 
----------------------------------- 
第2周 
本週開始日期:2013-7-8 
本週結束日期:2013-7-14 
----------------------------------- 
----------------------------------- 
第3周 
本週開始日期:2013-7-15 
本週結束日期:2013-7-21 
----------------------------------- 
----------------------------------- 
第4周 
本週開始日期:2013-7-22 
本週結束日期:2013-7-28 
----------------------------------- 
----------------------------------- 
第5周 
本週開始日期:2013-7-29 
本週結束日期:2013-7-31 
----------------------------------- 
******************************************* 
******************************************* 
月份:8 
days:31 
----------------------------------- 
第1周 
本週開始日期:2013-8-1 
本週結束日期:2013-8-4 
----------------------------------- 
----------------------------------- 
第2周