在两个日期之间按月计算一周中的天数

Count days of the week by month between two dates

提问人:SBRW Dmitriy 提问时间:2/21/2023 更新时间:2/22/2023 访问量:65

问:

我在项目上遇到了一个问题,其实本质是什么:

有两个日期给出一个范围。在此范围内,您需要查找此范围中包含的月份名称,这已经完成,但您仍然需要查找此范围内每月包含的一周天数(例如,星期一)。

例如:

开始日期 - 01.01.2023

结束日期 - 02/28/202

范围内的月份 - 1 月、2 月

一月的星期一 - 5

二月的星期一 - 4

告诉我,你有什么想法可以做类似的事情吗,或者有人有类似的现成解决方案?

先谢谢你!

我建议有必要对循环和数组中的所有内容进行计数,但是我还不是很擅长它们,所以我需要帮助

c#

评论

0赞 Dai 2/21/2023
...这是为了家庭作业还是什么?
0赞 Dai 2/21/2023
“我建议有必要在一个循环和数组中计算所有内容”——我不同意你的建议......我们现在的技术比 1970 年代“循环”和“阵列”流行时更好——建议从“循环和阵列”构建解决方案就像建议用砖块和水泥建造一座坚固的西欧风格的房子:你没有,但这也不是一个特别有用的建议。
0赞 Srikanth 2/21/2023
planetcalc.com/7741 - 这是您可以在 2 个日期之间获得周数和数天的方法。
0赞 Srikanth 2/21/2023
一周将包含所有工作日。在考虑余数时,您可以考虑初始日期的星期几来计算额外的工作日。
0赞 Srikanth 2/21/2023
另请参阅此 stackoverflow.com/questions/248273/...

答:

0赞 Flydog57 2/22/2023 #1

这感觉就像家庭作业。我不为别人做作业(当我还是学生的时候,我就受够了)。我确实帮忙。

我忽略了@Dai和他的《Haskell》一书,而是用一个循环来展示如何做到这一点。

首先,考虑简单循环。语句由三个部分组成:forfor

for(initialize; validate; updateAtEndOfLoop)

通常,这会循环访问整数。例如:

for (var i = 0; i < someMaxValue; ++i) {
    DoSomethingWith(i);
}

该代码等效于:

{
    var i = 0;                     //initialize
    while (i < someMaxValue) {     //validate
        DoSomethingWith(i);
        ++i;                       //updateAtEndOfLoop
    }
}

但是,没有说循环必须处理整数,特别是它们可以处理 s。forDateTime

请考虑以下代码:

var startDate = new DateTime(2023, 1, 22);
var endDate = DateTime.Today;
var increment = TimeSpan.FromDays(1);

这将设置上个月的开始日期和今天的结束日期,以及一个增量值,即 .具体而言,您可以将 a 添加到 中,该添加将产生一个新的 .TimeSpanTimeSpanDateTimeDateTime

所以,我可以说:

for (var date = startDate; date <= endDate; date += increment) {
    DoSomethingWith(date);
}

另一件值得注意的事情是 s 有一个属性。 是对应于一周中的几天。如果将枚举转换为字符串(使用 ,它将呈现为字符串值的星期几(如)。DateTimeDayOfWeekDayOfWeekenum.ToString"Sunday"

在我的测试用例中,我将其用作循环的主体:

Debug.WriteLine($"{date.Year}-{date.Month}-{date.Day}: {date.DayOfWeek} ({(int)date.DayOfWeek})");

这导致它显示在 Visual Studio 的窗格中:Output

2023-1-22: Sunday (0)
2023-1-23: Monday (1)
2023-1-24: Tuesday (2)
2023-1-25: Wednesday (3)
2023-1-26: Thursday (4)
2023-1-27: Friday (5)
2023-1-28: Saturday (6)
2023-1-29: Sunday (0)
2023-1-30: Monday (1)
2023-1-31: Tuesday (2)
2023-2-1: Wednesday (3)
2023-2-2: Thursday (4)
2023-2-3: Friday (5)
2023-2-4: Saturday (6)
2023-2-5: Sunday (0)
2023-2-6: Monday (1)
2023-2-7: Tuesday (2)
2023-2-8: Wednesday (3)
2023-2-9: Thursday (4)
2023-2-10: Friday (5)
2023-2-11: Saturday (6)
2023-2-12: Sunday (0)
2023-2-13: Monday (1)
2023-2-14: Tuesday (2)
2023-2-15: Wednesday (3)
2023-2-16: Thursday (4)
2023-2-17: Friday (5)
2023-2-18: Saturday (6)
2023-2-19: Sunday (0)
2023-2-20: Monday (1)
2023-2-21: Tuesday (2)

这应该足以解决您的问题。