• 在C#中如何自定义配置上周和本周起始日来查询业务数据?


    cover.png

    作者:西瓜程序猿
    主页传送门:https://www.cnblogs.com/kimiliucn


    前言

    在做某个报表管理功能时,有一个需求:需要根据自定义配置的[周起始日]来统计上周、本周的订单数据。在C#中并没有封装的方法根据我们需要来直接获取上一周某天到某天、本周某天到某天,所以需要我们自己封装方法来实现(我们也可以按照这个思路使用其他语言来实现)。


    一、需求与思路

    需求是这样的,我们需要根据自定义配置的[周起始日]来统计上周、本周的订单数据,具体看下文介绍。

    1.1-需求介绍

    举个例子:假设今天是【2023年9月19日(星期二)】,若配置的是【周一】,那么上周要查询的时间是从上周一计数到上周日(2023年9月11日——2023年9月17日),那么本周要查询的时间是本周一计数到本周日(2023年9月18日——2023年9月24日)。
    image.png
    若配置的是【周日】,那么上周要查询的时间是从上上周日计数到上周六(2023年9月10日——2023年9月16日),那么本周要查询的时间是上周日计数到本周六(2023年9月17日——2023年9月23日)。【注意:因为上文假设今天是2023年9月19日(星期二),而配置的是(星期日),当还未到这一天,所有需要取离最近的上一周的星期日】
    image.png
    另外一个场景,如果假设今天是【2023年9月24日(星期日)】,若配置的是【周日】,那么上周要查询的时间是从上周日计数到本周六(2023年9月17日——2023年9月23日),那么本周要查询的时间是上周日计数到本周六(2023年9月24日——2023年9月30日)。
    image.png


    1.2-开发思路

    第一步:首先新建了一个配置表,来存储我们配置的是星期几,[西瓜程序猿]这边存的是字符串数字(1-7),1表示星期一,2表示星期二,7表示星期日,以此类推。


    第二步【核心】:根据配置的[周起始日]来计算出,上一周要查询的数据从哪一天开始到哪一天结束,本周要查询的数据应该从哪一天开始到哪一天结束(本文代码演示主要就是介绍这一块逻辑)。


    第三步:根据计算出来的开始/结束日期,来根据[订单创建的时间](根据自己业务需求)来和计算出来的日期判断即可。


    二、代码实现

    2.1-封装

            /// 
            /// 获得上周、本周配置时间(用于读取数据)
            /// 
            /// 配置的[周起始日]
            /// 当前时间
            /// 
            public static (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 = GetWeekValues(now.DayOfWeek);
                DateTime currentDate = now.Date; 
                string upper_week_begin, upper_week_end, this_week_begin, this_week_end;
                //如果配置的星期 大于 当前星期
                if (startWeekDay > currentDayOfWeek || startWeekDay == currentDayOfWeek)
                {
                    DayOfWeek week = GetWeekEnums(startWeekDay);
                    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
                {
                    //返回本周和上周的开始和结束日期
                    DayOfWeek week = GetWeekEnums(startWeekDay);
                    DateTime thisWeekMonday = GetDayOfWeek(now, week);//本周的开始日期
    				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);
            }
    
            
    
            /// 
            /// 获取上一个指定星期的日期
            /// 
            /// 
            /// 
            /// 
            public static DateTime GetDayOfWeek(DateTime date, DayOfWeek targetDayOfWeek)
    		{
    			int diff = (7 + (date.DayOfWeek - targetDayOfWeek)) % 7;
    			return date.AddDays(-diff).Date;
    		}
    
            /// 
            /// 根据枚举获得星期值
            /// 
            /// 
            /// 
            public static int GetWeekValues(DayOfWeek targetDayOfWeek)
            {
                switch (targetDayOfWeek)
                {
                    case DayOfWeek.Monday:
                        return 1;
                    case DayOfWeek.Tuesday:
                        return 2;
                    case DayOfWeek.Wednesday:
                        return 3;
                    case DayOfWeek.Thursday:
                        return 4;
                    case DayOfWeek.Friday:
                        return 5;
                    case DayOfWeek.Saturday:
                        return 6;
                    case DayOfWeek.Sunday:
                        return 7;
                    default:
                        return 1;//默认星期一
                }
            }
    
            /// 
            /// 根据星期值获得枚举
            /// 
            /// 
            /// 
            public static DayOfWeek GetWeekEnums(int startWeekDay)
            {
                switch (startWeekDay)
                {
                    case 1:
    					return DayOfWeek.Monday;
                    case 2: 
    					return DayOfWeek.Tuesday;
                    case 3: 
    					return DayOfWeek.Wednesday;
                    case 4: 
    					return DayOfWeek.Thursday;
                    case 5: 
    					return DayOfWeek.Friday;
                    case 6: 
    					return DayOfWeek.Saturday;
                    case 7: 
    					return DayOfWeek.Sunday;
                    default:
                        return DayOfWeek.Monday;//默认星期一
                }
            }
    

    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


    __EOF__

  • 本文作者: 西瓜程序猿
  • 本文链接: https://www.cnblogs.com/kimiliucn/p/17715464.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    docker-compose部署mysql
    linux中docker不能联网?
    DDoS类型攻击对企业造成的危害
    基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)
    【TypeScript】中定义变量方式 | 数据类型详解
    linuxcnc分支machinekit
    小谈设计模式(13)—外观模式
    SpringCloud基础知识【Feign声明式系统调用】
    前端JS基础第三篇:七道例题带你弄懂this指向问题
    其他算法和思想的题目
  • 原文地址:https://www.cnblogs.com/kimiliucn/p/17715464.html