C# 如何获取一个月的"greyed"天 日期时间



在Windows 10日历中,例如,我们发现一个7x6天的网格表示一个月中的每一天,但很明显,没有一个月有42天,所以"溢出";无论如何,显示在网格中但不是本月的日期都会变灰为另一个月的日期。有没有一些简单的方法可以通过DateTime类在C#上度过这些日子?

例如,在2020/08年;灰色的日子";为:26、27、28、29、30、31(上月天数(和1、2、3、4、5(下月天数(。

如果这还不清楚,这是一张截图,显示了我提到的日子

我找不到任何与我的问题相关的问题。

编辑:

最好的答案是@ChilliPenguin,这是我的实现:

public static MonthGrayDays GrayDays(this DateTime time) {
List<DateTime> before = new List<DateTime>();
List<DateTime> after = new List<DateTime>();
DateTime firstDay = new DateTime(time.Year, time.Month, 1);
DateTime prevMonth = firstDay.AddDays(-1);
DateTime nextMonth = firstDay.AddMonths(1);
int daysInMonth = DateTime.DaysInMonth(time.Year, time.Month);
for (int a = 0; a < (int)firstDay.DayOfWeek; a++)
{
before.Add(prevMonth.AddDays(-a));
}
before.Reverse();
int count = before.Count();
for (int b = 0; b < 42 - count - daysInMonth; b++)
{
after.Add(nextMonth.AddDays(b));
}
return new MonthGrayDays {previousMonth = before, nextMonth = after};
}

这是DateTime类的一个Extension方法,它返回一个自定义类,该类返回月份前后的日期,该类的实现如下:

public class MonthGrayDays {
public List<DateTime> previousMonth;
public List<DateTime> nextMonth;
}

要使用扩展方法,只需调用:

DateTime now = new DateTime(2020, 8, 1);
foreach (DateTime date in now.GrayDays().previousMonth) {
Console.WriteLine(date.Day);
}
Console.WriteLine("/");
foreach (DateTime date in now.GrayDays().nextMonth) {
Console.WriteLine(date.Day);
}

我不认为有自动解决方案,但逻辑足够简单,可以逐步完成。最重要的是DateTime.DayOfWeek属性。它返回对应于星期日到星期六的DayOfWeek枚举值,该枚举值可以相应地转换为范围从0到6的int

以您的月份为例,构造一个对应于该月1日的DateTime对象。现在取其DayOfWeek并转换为int,现在您可以在日历顶部看到灰色天数。从月底开始计算数字同样简单。为该月的最后一天构建一个DateTime对象,并将其DayOfWeek强制转换为int并从6中减去以获得灰色天数。

如果你需要为那些灰色的日子定日期,从这个月的第一天开始,减去24小时,得到上个月的最后一天。日历末尾的灰色天数可以假定为从1开始。

使用DateTime和DateTimeOffset结构,您可以使用day of week函数计算月份类型的第一天。这将返回一个枚举。如果您将enum转换为int(注意,0=sunday,它确实与windows日历相关(,则可以循环返回以获取这些日期。我建议使用列表来存储这些日期,但我不知道您当前的情况:(

for (int a = 0; a < (int)FirstDay.DayOfWeek; a++)
{
graydays.Add(prevmonth.AddDays(-a));
}

要获得当月之后的日期,我们可以获得列出的天数、当月的天数和网格面积(在本例中为42(,以计算我们需要考虑的当月之后的天数。

int count = graydays.Count();
for (int b = 0; b < 42 - count - daysinmonth; b++)
{
graydays.Add(LastDayOfMonth.AddDays(b));
}

注意,要获取每月的日期,您需要使用DateTime。DaysInMonth((函数,要得到Last day,只需在第一天加1个月,然后减去一天。

最新更新