经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
在C#中如何自定义配置上周和本周起始日来查询业务数据?
来源:cnblogs  作者:西瓜程序猿  时间:2023/9/20 9:31:58  对本文有异议

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

  1. /// <summary>
  2. /// 获得上周、本周配置时间(用于读取数据)
  3. /// </summary>
  4. /// <param name="startWeekDay">配置的[周起始日]</param>
  5. /// <param name="now">当前时间</param>
  6. /// <returns></returns>
  7. public (string upper_week_begin, string upper_week_end, string this_week_begin, string this_week_end) GetWeekTimeStr(int startWeekDay, DateTime now)
  8. {
  9. if (startWeekDay < 1 || startWeekDay > 7)
  10. {
  11. throw new ArgumentOutOfRangeException(nameof(startWeekDay), "startWeekDay must be between 1 and 7.");
  12. }
  13. int currentDayOfWeek = (int)now.DayOfWeek;//获取当前日期为星期几
  14. DateTime currentDate = DateTime.Now.Date; //获取到当前日期
  15. string upper_week_begin, upper_week_end, this_week_begin, this_week_end;
  16. //如果配置的星期 大于 当前星期
  17. if (startWeekDay > currentDayOfWeek || startWeekDay == currentDayOfWeek)
  18. {
  19. DayOfWeek week = DayOfWeek.Monday;
  20. switch (startWeekDay)
  21. {
  22. case 1: week = DayOfWeek.Monday; break;
  23. case 2: week = DayOfWeek.Tuesday; break;
  24. case 3: week = DayOfWeek.Wednesday; break;
  25. case 4: week = DayOfWeek.Thursday; break;
  26. case 5: week = DayOfWeek.Friday; break;
  27. case 6: week = DayOfWeek.Saturday; break;
  28. case 7: week = DayOfWeek.Sunday; break;
  29. default:
  30. break;
  31. }
  32. DateTime lastThursday = GetDayOfWeek(currentDate, week);//本周的开始日期
  33. DateTime lastWeekSunday = lastThursday.AddDays(6);//本周的结束日期,根据[本周开始日期]往后推6天
  34. DateTime lastLastThursday = GetDayOfWeek(lastThursday.AddDays(-1), week);//根据本周的开始时间,往前推1天,找到上一周的开始时间
  35. DateTime lastLastWeekSunday = lastLastThursday.AddDays(6);//上一周的结束时间
  36. upper_week_begin = lastLastThursday.ToString("yyyy-MM-dd");
  37. upper_week_end = lastLastWeekSunday.ToString("yyyy-MM-dd");
  38. this_week_begin = lastThursday.ToString("yyyy-MM-dd");
  39. this_week_end = lastWeekSunday.ToString("yyyy-MM-dd");
  40. }
  41. else
  42. {
  43. //返回本周和上周的开始和结束日期
  44. DateTime thisWeekMonday = GetDayOfWeek(now, DayOfWeek.Monday);//本周的开始日期
  45. DateTime thisWeekSunday = thisWeekMonday.AddDays(6); //本周的结束日期,根据[本周开始日期]往后推6天
  46. DateTime lastWeekMonday = thisWeekMonday.AddDays(-7);//根据[本周开始日期],往前推7天,得到[上周开始时间]
  47. DateTime lastWeekSunday = thisWeekMonday.AddDays(-1);//根据[本周的开始日期],往前推1天,得到[上周结束时间]
  48. upper_week_begin = lastWeekMonday.ToString("yyyy-MM-dd");
  49. upper_week_end = lastWeekSunday.ToString("yyyy-MM-dd");
  50. this_week_begin = thisWeekMonday.ToString("yyyy-MM-dd");
  51. this_week_end = thisWeekSunday.ToString("yyyy-MM-dd");
  52. }
  53. return (upper_week_begin, upper_week_end, this_week_begin, this_week_end);
  54. }
  55. /// <summary>
  56. /// 获取上一个指定星期的日期
  57. /// </summary>
  58. /// <param name="date"></param>
  59. /// <param name="targetDayOfWeek"></param>
  60. /// <returns></returns>
  61. public static DateTime GetDayOfWeek(DateTime date, DayOfWeek targetDayOfWeek)
  62. {
  63. int diff = (7 + (date.DayOfWeek - targetDayOfWeek)) % 7;
  64. return date.AddDays(-diff).Date;
  65. }

2.2-使用

  1. var item = GetWeekTimeStr(startWeekDay, now);
  2. // 取出数据
  3. if (!string.IsNullOrEmpty(item.upper_week_begin))
  4. {
  5. }
  6. if (!string.IsNullOrEmpty(item.upper_week_end))
  7. {
  8. }
  9. if (!string.IsNullOrEmpty(item.this_week_begin))
  10. {
  11. }
  12. if (!string.IsNullOrEmpty(item.this_week_end))
  13. {
  14. }

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



原文链接:https://www.cnblogs.com/kimiliucn/p/17715464.html

原文链接:https://www.cnblogs.com/kimiliucn/p/17715464.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号