【发布时间】:2025-12-18 15:45:02
【问题描述】:
我想知道如何根据一年中一周的序数计算一个月的星期几。例如,我正在处理第 33 周,我应该知道那是 8 月的第 2 周。 我已经计算了几个月,但现在我要处理几周。
我已经有了解决方案,但对我来说似乎很脏..
代码如下:
var data = query.GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.CreatedDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday))
.Select(article => new ArticleSimpleObject
{
Week = GetWeekNumberOfMonth(article.FirstOrDefault().CreatedDate.Value),
Amount = article.Sum(x => x.Amount),
Month = article.FirstOrDefault().CreatedDate.Value.Month
});
这是我用来获取周数的方法:
private static int GetWeekNumberOfMonth(DateTime date)
{
date = date.Date;
DateTime firstMonthDay = new DateTime(date.Year, date.Month, 1);
DateTime firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
if (firstMonthMonday > date)
{
firstMonthDay = firstMonthDay.AddMonths(-1);
firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
}
return (date - firstMonthMonday).Days / 7 + 1;
}
正如我写的,这个解决方案有效,
但我个人不喜欢它,我想有更优雅的解决方案,这就是为什么我发布这个问题来帮助自己和未来的读者,如果有经验的人帮助我们解决这个问题:)
也许这可以基于日历类https://docs.microsoft.com/en-us/dotnet/api/system.globalization.calendar?view=netframework-4.8来解决
我尝试了一些变体,但我什至没有接近解决它..
谢谢大家
干杯
【问题讨论】:
-
当您已经有一个接受日期的
GetWeekNumberOfMonth方法时,为什么还需要根据序数计算月份中的星期几? -
@mm8 是的,有一个 GetWeekNumberOfMonth 方法,但我想知道是否有更优雅的日历类或类似的解决方案。
-
您的描述说根据一年中的一周计算一个月中的一周,但您的代码似乎与此无关。你真正想要完成的是什么?一周中的哪一天为您开启一周?
标签: c# linq datetime asp.net-core-webapi datetime-format