C# C“如何获得”;“灰色”;月日日期时间

C# C“如何获得”;“灰色”;月日日期时间,c#,datetime,calendar,C#,Datetime,Calendar,例如,在Windows 10日历中,我们发现一个7x6天的网格表示一个月中的每一天,但很明显,没有一个月有42天,因此“溢出”天,无论如何,网格中显示但不属于当前月份的天将灰显为另一个月的天。有没有什么简单的方法可以让你在C#with DateTime课程上学习 例如,在2020/08年,“灰色天数”是:26、27、28、29、30、31(上个月的天数)和1、2、3、4、5(下个月的天数) 我找不到任何与我的问题相关的问题 编辑: 最好的答案是@ChilliPenguin,这是我的实现: pu

例如,在Windows 10日历中,我们发现一个7x6天的网格表示一个月中的每一天,但很明显,没有一个月有42天,因此“溢出”天,无论如何,网格中显示但不属于当前月份的天将灰显为另一个月的天。有没有什么简单的方法可以让你在C#with DateTime课程上学习

例如,在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.DayOfWeek
属性。它返回一个对应于星期日到星期六的
DayOfWeek
enum值,该值可以相应地转换为介于0到6之间的
int

以您的月份为例,构造一个对应于该月1号的
DateTime
对象。现在将它的
DayOfWeek
转换为
int
,现在你在日历顶部有了灰色天数。从月底得到数字同样简单。为月的最后一天构建一个
DateTime
对象,并将其
DayOfWeek
转换为
int
,然后从6中减去灰色天数


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

使用DateTime和DateTimeOffset结构,您可以使用函数计算月份类型的第一天。这将返回一个枚举。如果您将枚举转换为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));
    }
int count=graydays.count();
对于(int b=0;b<42-count-daysinmonth;b++)
{
graydays.Add(LastDayOfMonth.AddDays(b));
}

请注意,要获取daysinmonth,需要使用DateTime.daysinmonth()函数,要获取最后一天,只需在第一天加上一个月,然后减去一天。

您可以通过了解月长(记住二月很复杂)、一些数学知识和一些if语句来解决这个问题(或者可能是
开关
)。你打算用这些信息做什么?也许有一种更简单的方法可以到达你想去的地方?@Flydog57这是一种方法,但有点复杂,没有什么不可能。我正在用它在我的C#游戏中使用Godot创建一个自定义虚拟日历,我可以只显示一个月中的几天,但为了添加更多细节,我选择不o添加此功能我认为它所做的是只获取月开始的第一行的周数,然后继续获取月结束的天数,直到填充6行。请注意,这是动态的,基于您设置的周开始的日期创建整个DateTime对象列表并不是很有效@StevenGann日期时间列表是一项功能性要求,灰色日子的参考也是如此
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);
}
for (int a = 0; a < (int)FirstDay.DayOfWeek; a++)
        {
            graydays.Add(prevmonth.AddDays(-a));
        }
int count = graydays.Count();

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