在做某個報表管理功能時,有一個需求:需要根據自定義配置的[周起始日]來統計上周、本周的訂單數據。在C#中並沒有封裝的方法根據我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實現(我們也可以按照這個思路使用其他語言來實現)。 ...
作者:西瓜程式猿
主頁傳送門:https://www.cnblogs.com/kimiliucn
前言
在做某個報表管理功能時,有一個需求:需要根據自定義配置的[周起始日]來統計上周、本周的訂單數據。在C#中並沒有封裝的方法根據我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實現(我們也可以按照這個思路使用其他語言來實現)。
一、需求與思路
需求是這樣的,我們需要根據自定義配置的[周起始日]來統計上周、本周的訂單數據,具體看下文介紹。
1.1-需求介紹
舉個例子:假設今天是【2023年9月19日(星期二)】,若配置的是【周一】,那麼上周要查詢的時間是從上周一計數到上周日(2023年9月11日——2023年9月17日),那麼本周要查詢的時間是本周一計數到本周日(2023年9月18日——2023年9月24日)。
若配置的是【周日】,那麼上周要查詢的時間是從上上周日計數到上周六(2023年9月10日——2023年9月16日),那麼本周要查詢的時間是上周日計數到本周六(2023年9月17日——2023年9月23日)。【註意:因為上文假設今天是2023年9月19日(星期二),而配置的是(星期日),當還未到這一天,所有需要取離最近的上一周的星期日】
另外一個場景,如果假設今天是【2023年9月24日(星期日)】,若配置的是【周日】,那麼上周要查詢的時間是從上周日計數到本周六(2023年9月17日——2023年9月23日),那麼本周要查詢的時間是上周日計數到本周六(2023年9月24日——2023年9月30日)。
1.2-開發思路
第一步:首先新建了一個配置表,來存儲我們配置的是星期幾,[西瓜程式猿]這邊存的是字元串數字(1-7),1表示星期一,2表示星期二,7表示星期日,以此類推。
第二步【核心】:根據配置的[周起始日]來計算出,上一周要查詢的數據從哪一天開始到哪一天結束,本周要查詢的數據應該從哪一天開始到哪一天結束(本文代碼演示主要就是介紹這一塊邏輯)。
第三步:根據計算出來的開始/結束日期,來根據[訂單創建的時間](根據自己業務需求)來和計算出來的日期判斷即可。
二、代碼實現
2.1-封裝
/// <summary>
/// 獲得上周、本周配置時間(用於讀取數據)
/// </summary>
/// <param name="startWeekDay">配置的[周起始日]</param>
/// <param name="now">當前時間</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;//獲取當前日期為星期幾
DateTime currentDate = DateTime.Now.Date; //獲取到當前日期
string upper_week_begin, upper_week_end, this_week_begin, this_week_end;
//如果配置的星期 大於 當前星期
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);//本周的結束日期,根據[本周開始日期]往後推6天
DateTime lastLastThursday = GetDayOfWeek(lastThursday.AddDays(-1), week);//根據本周的開始時間,往前推1天,找到上一周的開始時間
DateTime lastLastWeekSunday = lastLastThursday.AddDays(6);//上一周的結束時間
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
{
//返回本周和上周的開始和結束日期
DateTime thisWeekMonday = GetDayOfWeek(now, DayOfWeek.Monday);//本周的開始日期
DateTime thisWeekSunday = thisWeekMonday.AddDays(6); //本周的結束日期,根據[本周開始日期]往後推6天
DateTime lastWeekMonday = thisWeekMonday.AddDays(-7);//根據[本周開始日期],往前推7天,得到[上周開始時間]
DateTime lastWeekSunday = thisWeekMonday.AddDays(-1);//根據[本周的開始日期],往前推1天,得到[上周結束時間]
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>
/// 獲取上一個指定星期的日期
/// </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);
// 取出數據
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))
{
}
然後根據查詢出來的時間段,應用到自己需要的業務場景即可。
原文鏈接:https://www.cnblogs.com/kimiliucn/p/17715464.html
版權聲明:本文為原創文章,版權歸 [西瓜程式猿] 所有,轉載請註明出處,有任何疑問請私信咨詢。
原文鏈接:https://www.cnblogs.com/kimiliucn/p/17715464.html