C#中如何自定义配置上周和本周起始日来查询业务数据(思路详解)

 更新时间:2023年09月20日 09:12:45   作者:西瓜程序猿  
在C#中并没有封装的方法根据我们需要来直接获取上一周某天到某天、本周某天到某天,所以需要我们自己封装方法来实现(我们也可以按照这个思路使用其他语言来实现),感兴趣的朋友跟随小编一起看看吧

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

前言

在做某个报表管理功能时,有一个需求:需要根据自定义配置的[周起始日]来统计上周、本周的订单数据。在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))
{
}

然后根据查询出来的时间段,应用到自己需要的业务场景即可。

到此这篇关于在C#中如何自定义配置上周和本周起始日来查询业务数据的文章就介绍到这了,更多相关C#查询业务数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#实现输出的字符靠右对齐的示例

    c#实现输出的字符靠右对齐的示例

    下面小编就为大家分享一篇c#实现输出的字符靠右对齐的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 基于.NET编写工具类解决JSON乱码问题

    基于.NET编写工具类解决JSON乱码问题

    在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解决这一问题吧
    2025-03-03
  • C# 脚本引擎RulesEngine的使用详解

    C# 脚本引擎RulesEngine的使用详解

    这篇文章主要介绍了C# 脚本引擎RulesEngine的使用方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#连接数据库的方法

    C#连接数据库的方法

    ASP.NET连接数据库的技术叫ADO.NET,它是用来向数据库提交sql语句的一堆类。这里连接的是Sql Server 2008数据库,其他数据库用法差不多,就是调用的类名不一样
    2015-11-11
  • C#实现的Socket服务器端、客户端代码分享

    C#实现的Socket服务器端、客户端代码分享

    这篇文章主要介绍了C#实现的Socket服务器端、客户端代码分享,2个非常简单的入门例子,需要的朋友可以参考下
    2014-08-08
  • C#中的委托介绍

    C#中的委托介绍

    这篇文章主要介绍了C#中的委托介绍,本文讲解了声明委托的方式、匿名方法、多播委托等内容,需要的朋友可以参考下
    2015-01-01
  • C#操作DataTable的实现步骤

    C#操作DataTable的实现步骤

    本文主要介绍了C#操作DataTable的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C#对NULL的简化赋值的方法总结

    C#对NULL的简化赋值的方法总结

    在C#中,对null赋值意味着将引用类型的变量设置为无引用或者说空引用,当你声明一个引用类型的变量,如果没有给它初始化具体的对象,那么它的值就是null,本文给大家介绍了C#对NULL的简化赋值的方法总结,需要的朋友可以参考下
    2024-11-11
  • Winform 控件优化LayeredWindow无锯齿圆角窗体

    Winform 控件优化LayeredWindow无锯齿圆角窗体

    这篇文章主要为大家介绍了Winform 控件优化LayeredWindow实现无锯齿圆角窗体示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C#实现批量删除PDF页面(单页/多页)的实战技巧

    C#实现批量删除PDF页面(单页/多页)的实战技巧

    在自动化文档处理流程中,PDF 文件可能因导出错误、内容重复或格式转换问题而包含多余页面,本文演示如何使用免费库 Free Spire.PDF for .NET 删除 PDF 文件中的单个或多个页面,希望对大家有所帮助
    2026-04-04

最新评论