C#中如何自定義配置上周和本周起始日來查詢業(yè)務(wù)數(shù)據(jù)(思路詳解)
在做某個(gè)報(bào)表管理功能時(shí),有一個(gè)需求:需要根據(jù)自定義配置的[周起始日]來統(tǒng)計(jì)上周、本周的訂單數(shù)據(jù)。在C#中并沒有封裝的方法根據(jù)我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實(shí)現(xiàn)(我們也可以按照這個(gè)思路使用其他語言來實(shí)現(xiàn))。
前言
在做某個(gè)報(bào)表管理功能時(shí),有一個(gè)需求:需要根據(jù)自定義配置的[周起始日]來統(tǒng)計(jì)上周、本周的訂單數(shù)據(jù)。在C#中并沒有封裝的方法根據(jù)我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實(shí)現(xiàn)(我們也可以按照這個(gè)思路使用其他語言來實(shí)現(xiàn))。
一、需求與思路
需求是這樣的,我們需要根據(jù)自定義配置的[周起始日]來統(tǒng)計(jì)上周、本周的訂單數(shù)據(jù),具體看下文介紹。
1.1-需求介紹
舉個(gè)例子:假設(shè)今天是【2023年9月19日(星期二)】,若配置的是【周一】,那么上周要查詢的時(shí)間是從上周一計(jì)數(shù)到上周日(2023年9月11日——2023年9月17日),那么本周要查詢的時(shí)間是本周一計(jì)數(shù)到本周日(2023年9月18日——2023年9月24日)。
若配置的是【周日】,那么上周要查詢的時(shí)間是從上上周日計(jì)數(shù)到上周六(2023年9月10日——2023年9月16日),那么本周要查詢的時(shí)間是上周日計(jì)數(shù)到本周六(2023年9月17日——2023年9月23日)。【注意:因?yàn)樯衔募僭O(shè)今天是2023年9月19日(星期二),而配置的是(星期日),當(dāng)還未到這一天,所有需要取離最近的上一周的星期日】
另外一個(gè)場景,如果假設(shè)今天是【2023年9月24日(星期日)】,若配置的是【周日】,那么上周要查詢的時(shí)間是從上周日計(jì)數(shù)到本周六(2023年9月17日——2023年9月23日),那么本周要查詢的時(shí)間是上周日計(jì)數(shù)到本周六(2023年9月24日——2023年9月30日)。
1.2-開發(fā)思路
第一步:首先新建了一個(gè)配置表,來存儲我們配置的是星期幾,[西瓜程序猿]這邊存的是字符串?dāng)?shù)字(1-7),1表示星期一,2表示星期二,7表示星期日,以此類推。
第二步【核心】:根據(jù)配置的[周起始日]來計(jì)算出,上一周要查詢的數(shù)據(jù)從哪一天開始到哪一天結(jié)束,本周要查詢的數(shù)據(jù)應(yīng)該從哪一天開始到哪一天結(jié)束(本文代碼演示主要就是介紹這一塊邏輯)。
第三步:根據(jù)計(jì)算出來的開始/結(jié)束日期,來根據(jù)[訂單創(chuàng)建的時(shí)間](根據(jù)自己業(yè)務(wù)需求)來和計(jì)算出來的日期判斷即可。
二、代碼實(shí)現(xiàn)
2.1-封裝
/// <summary> /// 獲得上周、本周配置時(shí)間(用于讀取數(shù)據(jù)) /// </summary> /// <param name="startWeekDay">配置的[周起始日]</param> /// <param name="now">當(dāng)前時(shí)間</param> /// <returns></returns> public (string upper_week_begin, string upper_week_end, string this_week_begin, string this_week_end) GetWeekTimeStr(int startWeekDay, DateTime now) { if (startWeekDay < 1 || startWeekDay > 7) { throw new ArgumentOutOfRangeException(nameof(startWeekDay), "startWeekDay must be between 1 and 7."); } int currentDayOfWeek = (int)now.DayOfWeek;//獲取當(dāng)前日期為星期幾 DateTime currentDate = DateTime.Now.Date; //獲取到當(dāng)前日期 string upper_week_begin, upper_week_end, this_week_begin, this_week_end; //如果配置的星期 大于 當(dāng)前星期 if (startWeekDay > currentDayOfWeek || startWeekDay == currentDayOfWeek) { DayOfWeek week = DayOfWeek.Monday; switch (startWeekDay) { case 1: week = DayOfWeek.Monday; break; case 2: week = DayOfWeek.Tuesday; break; case 3: week = DayOfWeek.Wednesday; break; case 4: week = DayOfWeek.Thursday; break; case 5: week = DayOfWeek.Friday; break; case 6: week = DayOfWeek.Saturday; break; case 7: week = DayOfWeek.Sunday; break; default: break; } DateTime lastThursday = GetDayOfWeek(currentDate, week);//本周的開始日期 DateTime lastWeekSunday = lastThursday.AddDays(6);//本周的結(jié)束日期,根據(jù)[本周開始日期]往后推6天 DateTime lastLastThursday = GetDayOfWeek(lastThursday.AddDays(-1), week);//根據(jù)本周的開始時(shí)間,往前推1天,找到上一周的開始時(shí)間 DateTime lastLastWeekSunday = lastLastThursday.AddDays(6);//上一周的結(jié)束時(shí)間 upper_week_begin = lastLastThursday.ToString("yyyy-MM-dd"); upper_week_end = lastLastWeekSunday.ToString("yyyy-MM-dd"); this_week_begin = lastThursday.ToString("yyyy-MM-dd"); this_week_end = lastWeekSunday.ToString("yyyy-MM-dd"); } else { //返回本周和上周的開始和結(jié)束日期 DateTime thisWeekMonday = GetDayOfWeek(now, DayOfWeek.Monday);//本周的開始日期 DateTime thisWeekSunday = thisWeekMonday.AddDays(6); //本周的結(jié)束日期,根據(jù)[本周開始日期]往后推6天 DateTime lastWeekMonday = thisWeekMonday.AddDays(-7);//根據(jù)[本周開始日期],往前推7天,得到[上周開始時(shí)間] DateTime lastWeekSunday = thisWeekMonday.AddDays(-1);//根據(jù)[本周的開始日期],往前推1天,得到[上周結(jié)束時(shí)間] upper_week_begin = lastWeekMonday.ToString("yyyy-MM-dd"); upper_week_end = lastWeekSunday.ToString("yyyy-MM-dd"); this_week_begin = thisWeekMonday.ToString("yyyy-MM-dd"); this_week_end = thisWeekSunday.ToString("yyyy-MM-dd"); } return (upper_week_begin, upper_week_end, this_week_begin, this_week_end); } /// <summary> /// 獲取上一個(gè)指定星期的日期 /// </summary> /// <param name="date"></param> /// <param name="targetDayOfWeek"></param> /// <returns></returns> public static DateTime GetDayOfWeek(DateTime date, DayOfWeek targetDayOfWeek) { int diff = (7 + (date.DayOfWeek - targetDayOfWeek)) % 7; return date.AddDays(-diff).Date; }
2.2-使用
var item = GetWeekTimeStr(startWeekDay, now); // 取出數(shù)據(jù) if (!string.IsNullOrEmpty(item.upper_week_begin)) { } if (!string.IsNullOrEmpty(item.upper_week_end)) { } if (!string.IsNullOrEmpty(item.this_week_begin)) { } if (!string.IsNullOrEmpty(item.this_week_end)) { }
然后根據(jù)查詢出來的時(shí)間段,應(yīng)用到自己需要的業(yè)務(wù)場景即可。
到此這篇關(guān)于在C#中如何自定義配置上周和本周起始日來查詢業(yè)務(wù)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C#查詢業(yè)務(wù)數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#讀取Appconfig中自定義的節(jié)點(diǎn)
我們往往需要在App.config中自定義一些節(jié)來滿足實(shí)際需要,而不依賴于App.config的appSettings,下面通過一個(gè)簡單的實(shí)例來說明自定義配置節(jié)點(diǎn)的設(shè)置與讀取2015-06-06C#使用Shader實(shí)現(xiàn)夜幕降臨倒計(jì)時(shí)的效果
這篇文章主要介紹了C#使用Shader實(shí)現(xiàn)夜幕降臨倒計(jì)時(shí)的效果,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10淺析C# 9.0 新特性之 Lambda 棄元參數(shù)
這篇文章主要介紹了C# 9.0 新特性之 Lambda 棄元參數(shù)的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),想學(xué)習(xí)c#的朋友可以了解下2020-06-06