- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
作者:西瓜程序猿 主页传送门: https://www.cnblogs.com/kimiliucn 。
在做某个报表管理功能时,有一个需求:需要根据自定义配置的[周起始日]来统计上周、本周的订单数据。在C#中并没有封装的方法根据我们需要来直接获取上一周某天到某天、本周某天到某天,所以需要我们自己封装方法来实现(我们也可以按照这个思路使用其他语言来实现).
需求是这样的,我们需要根据自定义配置的[周起始日]来统计上周、本周的订单数据,具体看下文介绍.
举个例子:假设今天是【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-7),1表示星期一,2表示星期二,7表示星期日,以此类推.
第二步【 核心 】:根据配置的[周起始日]来计算出,上一周要查询的数据从哪一天开始到哪一天结束,本周要查询的数据应该从哪一天开始到哪一天结束(本文代码演示主要就是介绍这一块逻辑).
第三步:根据计算出来的开始/结束日期,来根据[订单创建的时间](根据自己业务需求)来和计算出来的日期判断即可.
/// <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;
}
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#中如何自定义配置上周和本周起始日来查询业务数据?的文章就讲到这里了,如果你想了解更多关于在C#中如何自定义配置上周和本周起始日来查询业务数据?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 C#。 我知道我可以用 ToLongDateString() 显示如下内容: Friday, February 27, 2009 我喜欢做的是展示类似的东西: Febru
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
我需要检查是否 DateTime.Now是在每个月的前 3 个工作日(周一至周五)。我还需要提供一个 List有国定假日,应相应处理。 如果 DateTime.Now 是星期六并且是该月的 1 号,则
我想以 2012 年 1 月 1 日 - 2012 年 1 月 31 日的格式显示日期 并获取由 dateranges['jan 1,2012 - jan 31,2012','December 1,2
我有这两个函数可以以正确的格式 (mm-dd-yyyy) 创建一个新字符串,但现在它似乎工作得不太好......当我输入日期 31-03-2013 这是一个有效的日期,它出现在 04-01-2013
我只想在 Fullcalendar 中加载 December 月份,其中 2 个日期启用 2012 年 12 月 14 日、15 日。 var date = new Date(2012, 11); v
我创建了一个convertDate类,用于转换我的时间戳,即Date().sinceReferenceDate(即自2001年1月1日凌晨12:00起)。我有一个问题:当时间戳的日期超过 3 周前时,
我有来自两个来源的数据,我试图在日期/时间上进行匹配。问题是我没有得到匹配。所以我将日期/时间转换为 Julian 并遇到了一些奇怪的事情。 8/11/2015 6:50:22.000 42227
我正在尝试将毫秒转换为如下所示的日期:Oct 04, 2013 .我将毫秒转换为日期对象: var d1 = new Date(milliseconds); 然后输出如下内容: Fri Oct 04
我正在尝试使用 javascript 进行倒计时。但是,我的倒计时只能计算天数、小时数、分钟数和秒数。我还想显示年份和月份。 以下是我的代码: today = new Date();
我有下面的查询不适合我, 这个函数 from_tz(to_timestamp(START_TIME, 'YYYYMMDDHH24MISS'), substr(UTC_TIME_CODE_OFFSET,
例如,我有一列数据如下: 17.14.11 17.15.10 18.21.06 现在是 2017 年 11 月 14 日,我想将其更改为 DateTime 对象,例如: 2017-11-14 2017
$date1 = "2000-01-01"; $date2 = "2011-03-14"; $diff = abs(strtotime($date2) - strtotime($date1)); $y
我有以下代码来验证给定日期格式的日期: val df = new SimpleDateFormat("MM/dd/yyyy"); df.setLenient(false); try { val
我有一个包含两个 DateTime 成员的类。 但是,当我尝试将表示日期的“人类可读”值分配给 DateTime 成员时,它拒绝它并显示消息“字符串未被识别为有效的 DateTime”。 失败的代码行
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
这个问题已经有答案了: Adding days to a date in Java [duplicate] (6 个回答) 已关闭 6 年前。 如何在 java 中将给定的日期转换为日历格式。 示例初
这个问题已经有答案了: Illegal pattern character 'T' when parsing a date string to java.util.Date (4 个回答) 已关闭 6
我现在在香港。如何获取美国的年、月、日? 我已经尝试过: Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new
我正在尝试使用 php 和 Mysql 开发一个搜索系统,但是您如何搜索:例如当数据库中的日期格式为 2012-03-26(年/月/日)时的三月份 最佳答案 根据列数据的格式,这样的事情可能会起作用:
我是一名优秀的程序员,十分优秀!