首页 > 编程语言 >在C#中如何自定义配置上周和本周起始日来查询业务数据?

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

时间:2023-09-19 18:48:24浏览次数:250  
标签:week DayOfWeek begin 自定义 upper C# 起始 DateTime 2023

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-封装

        /// <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

标签:week,DayOfWeek,begin,自定义,upper,C#,起始,DateTime,2023
From: https://www.cnblogs.com/kimiliucn/p/17715464.html

相关文章

  • [IJCAI 2023]Fighting against Organized Fraudsters Using Risk Diffusion-based Par
    [IJCAI2023]FightingagainstOrganizedFraudstersUsingRiskDiffusion-basedParallelGraphNeuralNetwork文章设计了一种基于社区的医疗保险欺诈行为检测。模型为了提高精度,模型设计了一组异构图模型和一组同构图模型。输入的异构图是保险受益人-医疗服务提供者的图,......
  • clickhouse学习笔记
    一、query相关1.展示正在处理的请求列表showprocesslist2.杀掉正在处理的查询KILLQUERYWHEREquery_id='2-857d-4a57-9ee0-327da5d60a90'二、修改名称--1.重命名RENAMEDATABASE|TABLE|DICTIONARYnameTOnew_name--2.交换2个表的名称EXCHANGETAB......
  • KingbaseES数据库导入数据invalid byte sequence for encoding
    一、适用版本:KingbaseES数据库所有版本。二、问题现象:使用备份的数据进行还原,还原过程中发生异常。日志信息:sys_restore:connectingtodatabaseforrestoresys_restore:creatingTABLE"public.table_name"sys_restore:creatingCOMMENT"public.COLUMNtable_name.co......
  • java连接sql server2008 r2 错误Cannot create PoolableConnectionFactory 错误
    解决办法首先确认你的密码是不是对的。如果是对的:所有程序->MicrosoftSQLServer2005->配置工具->SQLServerConfigurationManager 选择:SQLServer2005网络配置,然后选择:MSSQLSERVER的协议,然后将TCP/IP右键启动,然后右键TCP/IP,选择属性,选择IP地址,在IP1下边的“已启用”......
  • svn 提交的时候 Transaction is out of date
    更新一下再提交就好了 Transactionisoutofdate svn:Commitfailed(detailsfollow): svn:Outofdate:'/project/test/branches/test'intransaction'i' eclips控制台提示如上错误 解决:这个是由于本地版本与svn上版本不同造成的,更新一下在提交就OK了 ......
  • Eclipse Java注释模板设置详解
    设置注释模板的入口:Window->Preference->Java->CodeStyle->CodeTemplate然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一介绍:文件(Files)注释标签:/***@Title:${file_name}*@Package${package_name}*@Description:${todo}(用一句话描......
  • 加入华为云AIGC实战营,一起探索AI前沿技术!
    今年以来,AI热度持续攀升。在近日刚刚召开的2023INCLUSION·外滩大会上,AI技术再一次成为了关注的重点,麦肯锡中国区主席、全球资深董事合伙人更是直言,生成式AI的技术风暴有望开启一场关系到未来8-10年的新一轮技术和产业变革。生成式人工智能AIGC是人工智能1.0时代进入2.0时......
  • 无涯教程-JavaScript - SUM函数
    描述SUM函数可添加值。语法SUM(number1,[number2]...)争论Argument描述Required/Optionalnumber1Thefirstnumberyouwanttoadd.Thenumbercanbeavalue,acellreference,oracellrange.Requirednumber2,…Youcanspecifyupto255additionaln......
  • Harmony Codelab样例—弹窗基本使用
    一、介绍本篇Codelab主要基于dialog和button组件,实现弹窗的几种自定义效果,具体效果有:​1.警告弹窗,点击确认按钮弹窗关闭。​2.确认弹窗,点击取消按钮或确认按钮,触发对应操作。​3.加载弹窗,展示加载中效果。​4......
  • Road To Reality(The roots of science)
    RoadToReality(Therootsofscience)TheGood,theTrue,andtheBeautiful......