java 實現根據年月得到這個月的日曆
最近在專案中進行考勤打卡的模組的開發,中間的業務涉及到對某年某月的資料統計,特在此做出一個小結,高手可以忽略,不喜勿噴。
根據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。
其實在成長的路上我們會發現,難倒程式設計師的不是功能的實現,而是完善的業務梳理。由於甲方的需求存在著變動,所以能設計出靈活完善的流程顯得尤為重要,當然這也來自我們日積月累的成長,慢慢的自己就會注意在程式設計中避免硬編碼,儘量讓程式可擴充套件更加靈活。減少因需求變動導致的程式碼改動。
尊重原創,希望可以和廣大朋友更好的成長,一起加油!!!
相關文章
- S根據年月實現獲得當月天數
- vue之實現日曆----顯示農曆,滾動日曆監聽年月改變Vue
- 根據年月日判斷星期幾的c程式C程式
- 根據年月份分表
- 根據兩個日期之間獲取LocalDate日曆列表LDA
- 根據公曆計算農曆
- 用java實現日曆demo。Java
- java中介面多個實現類,如何指定實現類,根據子類型別選擇實現方法Java型別
- SAP S4HANA 根據PO號碼得到各個ITEM的Conditions資料
- 縱享絲滑滑動切換的周月日曆,水滴效果,豐富自定義日曆樣式,仿小米日曆(ViewDragHelper實現)View
- python根據字典內的值實現排序Python排序
- 根據現象分析Java程式設計師三十歲這個問題究竟要如何看待Java程式設計師
- 分享一個session過期後根據guard跳轉的實現Session
- 如何在 web 端實現一個有日曆的報表Web
- Java : List中 根據map的某個key去重Java
- 根據JavaScript中原生的XMLHttpRequest實現jQuery的AjaxJavaScriptXMLHTTPjQuery
- 根據業務能力實現DDD建模 - trond
- 爬蟲實現:根據IP地址反查域名爬蟲
- 根據兩點經緯度計算距離和角度——java實現Java
- 微信小程式實現簽到的日曆微信小程式
- 使用RecycleView實現無限滾動的日曆View
- 原生JavaScript實現造日曆輪子JavaScript
- 分享一個自己寫的取中國農曆相關資料的類。包含:農曆年月日,生肖,星座,年齡,天干,地支等方法
- 自定義 Behavior,實現巢狀滑動、平滑切換周月檢視的日曆巢狀
- Laravel-admin 如何根據 select 的值實現動態 formLaravelORM
- VVICAPI介面解析,實現根據ID取商品詳情API
- MyBatis 根據資料表反向生成 java 實體類等MyBatisJava
- 移動端日曆元件設計與實現元件
- 根據常用漢字生成雜亂的句子 --- javaJava
- VVICAPI介面解析,實現根據關鍵詞取商品列表API
- BIRT 中根據引數實現動態日期分組
- 根據原始碼模擬實現express框架常用功能原始碼Express框架
- 練手:一個基於Vue的上下滑動翻月日曆元件Vue元件
- Vue Router根據後臺資料載入不同的元件(思考->實現->不止於實現)Vue元件
- 微信小程式開發05-日曆元件的實現微信小程式元件
- 三行程式碼實現`年月日`的彈出控制元件行程控制元件
- 【一句日曆】2024年12月
- 【一句日曆】2024年11月