在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
在C#中如何自定义配置上周和本周起始日来查询业务数据?的更多相关文章
- [转]通过继承ConfigurationSection,在web.config中增加自定义配置
本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...
- .NET中如何自定义配置节点
.NET Framework在web.config或app.config中默认提供了很多种设置,以便能够改变应用程序内嵌组件的行为,例如<connectionStrings>.<ht ...
- spring中增加自定义配置支持
spring.schemas 在使用spring时,我们会首先编写spring的配置文件,在配置文件中,我们除了使用基本的命名空间http://www.springframework.org/sche ...
- ionic3中使用自定义配置
新工作接触了ionic,以前没用过,只是离职前短暂接触过类似的vuex,到需要修改公司项目的时候临时差什么学什么,其中一个是自定义配置项 配置是很常见的设置,之前用的thinkphp的配置很清晰,基本 ...
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
一. 场景 这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...
- Spring Boot2.0+中,自定义配置类扩展springMVC的功能
在spring boot1.0+,我们可以使用WebMvcConfigurerAdapter来扩展springMVC的功能,其中自定义的拦截器并不会拦截静态资源(js.css等). @Configur ...
- .net中webconfig自定义配置
在configuration节点,也就是文件的根节点下,增加如下节点 <appSettings> <!--<add key="propPath" value ...
- 在Web.config或App.config中的添加自定义配置
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍 ...
- C#如何使用和开发自定义配置节
在日常的程序设计中,如何灵活和巧妙地运用配置信息是一个成功的设计师的首要选择.这不仅是为了程序设计得更灵活性和可扩展性,也是为了让你的代码给人以清新的感觉.程序中的配置信息一般放在应用程序的app.c ...
- 在Web.config或App.config中的添加自定义配置 <转>
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置 ...
随机推荐
- ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案
去年年底,全新升级版的 ShowMeBug --一款支持实战编程的技术能力评估平台,首次揭开了它神秘的面纱. 而近日,ShowMeBug 再次迎来一系列产品更新,它将以全新的面貌,提供高信效度支撑的技 ...
- ESP8266-01S烧录固件
ESP8266-01S 整理了一下ESP01S的烧录固件和烧录APP 链接:https://pan.baidu.com/s/1DApOQcWhqvk378ZklJSypA 提取码:1028 文件夹包含 ...
- Swift4 入门到精通(第二章基本数据类型与量值)
第二章 量值和基本数据类型 Swift 支持的基本数据类型, 整型,浮点型,布尔型,元组,可选类型. 学习的目标: 常量与变量的意义.声明.命名规范.类型 数据进制与计算机存储原理 整型数据.浮点型数 ...
- Kubernetes(k8s)访问控制:身份认证
目录 一.系统环境 二.前言 三.Kubernetes访问控制 四.身份认证简介 五.身份认证 5.1 配置客户端机器 5.2 使用base auth的方式进行认证 5.3 使用token的方式进行认 ...
- PyTorch与机器学习中的随机化:减少噪声和随机性
目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例与代码实现讲 ...
- fidder中勾选check for certificate revocations导致手机无法连上fidder服务器
在测试过程中因为要获取一个小程序登录API,就用手机设置代理后抓取,在抓取过程中发现提示用户名密码错误(未使用代理正常登录) 遂逐步查找,在与别人核对tools-option发现自己https页签中勾 ...
- Hexo博客yilia主题使用cnzz统计网站访问量
使用友盟第三方的统计插件,网址:http://www.umeng.com/ 进入网站先注册账号然后根据下列图片进入添加站点. 添加站点,自己搭建的博客,需要统计访问量的网站(这里加入我的博客网站),然 ...
- 用googletest写cpp单测
框架概述 Google Test(也称为 googletest)是由 Google 开发的 C++ 单元测试框架.它的首个版本是在2004年发布的,作为 Google 内部的测试框架使用.随后,Goo ...
- Django学习笔记:第三章D的路由和视图
1.网站的入口--路由和视图 URL是网站Web服务的入口.用户在浏览器输入URL发出请求后,django会根据路由系统,运行对应的视图函数,然后返回信息到浏览器中. 1.1 认识路由 创建项目时,会 ...
- k8s+containerd安装
准备环境 准备两台服务器节点,如果需要安装虚拟机,可以参考<wmware和centos安装过程> 机器名 IP 角色 CPU 内存 centos01 192.168.109.130 mas ...