java 實現根據年月得到這個月的日曆

曰業而安發表於2020-12-04

最近在專案中進行考勤打卡的模組的開發,中間的業務涉及到對某年某月的資料統計,特在此做出一個小結,高手可以忽略,不喜勿噴。

根據2020-11-23這種日期格式獲取到這個月的日曆,如果是過去的月份則返回整個月份的日曆,如果是正在進行的月份,則返回日期截止到這個月最新的日期。

​
public class DateCountUtils {
    public static void main(String[] args) {
        // 2、列印出當前月份的工作日日期(條件來源:程式碼)
       List<String> monthDay = getMonthFullDayWorkingDay("2020-11-05");
       List<String> monthDay2 = getMonthFullDayWorkingDay("2020-12-02");
        System.out.println(monthDay);
        System.out.println(monthDay2);

    }

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    /**
     * 條件來源程式判斷:
     *  獲取當前月份的所有日期
     * @param date "2020-11-20"
     * @return 如果是當前月,返回到當月截止今天的日期集合   如果是之前月返回之前月的日期集合
     *
     * 來源:https://www.cnblogs.com/jinzhiming/p/6224860.html
     */
    public static List<String> getMonthFullDayWorkingDay(String date) {
        List<String> fullDayList = new ArrayList<String>();
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = 1;// 所有月份從1號開始
        Calendar cal = Calendar.getInstance();// 獲得當前日期物件

        // 獲取當前月的月份,和日期
        int current_month = cal.get(Calendar.MONTH) + 1;    // 當前月
        int current_date = cal.get(Calendar.DATE);  // 當前天

        cal.clear();// 清除資訊
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);// 1月從0開始
        cal.set(Calendar.DAY_OF_MONTH, day);
        // 判斷出入的時間中的月份是否在當前時間
        // 如果是過去的月份,則,獲取傳入的月份 整個月的工作日
        if(month < current_month){
            int count = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 獲取所在月份的最大天數
            for (int j = 0; j <= (count - 1); ) {
                // 判斷,如果是最後一個月份,跳出迴圈
                if (sdf.format(cal.getTime()).equals(getLastDay(year, month)))
                    break;
                // 否則,天數++
                cal.add(Calendar.DAY_OF_MONTH, j == 0 ? +0 : +1);
                j++;
                //=========================== 追加條件 Start ============================
                    // 追加日期
                    fullDayList.add(sdf.format(cal.getTime()));
                //=========================== 追加條件 End ============================

            }
        }
        // 如果相等,獲取 1號 到 今天的一個時間
        else if(month == current_month){
            int count = current_date; // 設定當前月份的當前天數
            for (int j = 0; j <= (count - 1); ) {
                // 判斷,如果是最後一個月份,跳出迴圈
                if (sdf.format(cal.getTime()).equals(getCurrentDay(year, month,current_date)))
                    break;
                // 否則,天數++
                cal.add(Calendar.DAY_OF_MONTH, j == 0 ? +0 : +1);
                j++;
                //=========================== 追加條件 Start ============================
                    // 追加日期
                fullDayList.add(sdf.format(cal.getTime()));
                //=========================== 追加條件 End ============================
            }
        }
    return fullDayList;
    }



    /**
     * 獲取所在月的最後一天
     * @param year  2020
     * @param month 10
     * @return  "2020-10-31 08:49:29"
     */
    public static String getLastDay(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, 0);
        return sdf.format(cal.getTime());
    }
    /**
     * 獲取本月 當前的日期
     * @param year  2020
     * @param month 10
     * @return  "2020-10-31 08:49:29"
     */
    public static String getCurrentDay(int year, int month,int data) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, data);
        return sdf.format(cal.getTime());
    }

    //查詢是周幾  1~7
    public static int dayForWeek(String pTime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        int dayForWeek = 0;
        try {
            c.setTime(format.parse(pTime));

            if (c.get(Calendar.DAY_OF_WEEK) == 1) {
                dayForWeek = 7;
            } else {
                dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
            }
            System.out.println(dayForWeek);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return dayForWeek;
    }








}



​

執行結果如下:

若要判斷日期是否為週六日,可以參考之前的部落格:https://blog.csdn.net/duan196_118/article/details/109847388

       在具體的業務場景中,或許我們需要的日期格式不一樣,可以根據上面的方法進行改進。若要加上節假日的判斷,我在展示程式碼中貼出了網址,需要的朋友可以做個參考,根據Excel的讀取去獲取節假日。另外還可以去呼叫免費節假日的API。但是這種情況存在一定的問題,比如當前沒網,那你的程式是不是就受到限制了。有興趣的朋友可以去百度一波。網上關於這個的部落格還是比較多的。比如:https://www.kancloud.cn/xiaoggvip/holiday_free/1606802

       其實在成長的路上我們會發現,難倒程式設計師的不是功能的實現,而是完善的業務梳理。由於甲方的需求存在著變動,所以能設計出靈活完善的流程顯得尤為重要,當然這也來自我們日積月累的成長,慢慢的自己就會注意在程式設計中避免硬編碼,儘量讓程式可擴充套件更加靈活。減少因需求變動導致的程式碼改動。

尊重原創,希望可以和廣大朋友更好的成長,一起加油!!!

相關文章