题目要求:
创建.NET Core控制台应用程序实现万年历,通过输入的年份和月份在控制台中打印出指定年份和月份的日历。
实现代码:
代码语言:javascript复制//做一个万年历
Console.WriteLine("请输入年份:");
string year = Console.ReadLine();
Console.WriteLine("请输入月份:");
string month = Console.ReadLine();
//获取星期几,这个月多少天
DateTime dt = DateTime.Parse(string.Format("{0}-{1}-1", year, month));
int week = (int)dt.DayOfWeek;
int monthsDay = DateTime.DaysInMonth(int.Parse(year), int.Parse(month));
Console.WriteLine("星期日t星期一t星期二t星期三t星期四t星期五t星期六t");
for (int i = 0; i < week; i )
{
Console.Write("t");
}
for (int i = 0; i < monthsDay; i )
{
Console.Write((i 1) "t");
if ((i week 1) % 7 == 0)
{
Console.WriteLine();
}
}
代码解析:
1、需要在控制台录入年份以及月份的两个信息。
string year = Console.ReadLine(); string month = Console.ReadLine();
2、需要根据年月计算当前月的一号是星期几。
获取具体的DateTime格式时间戳: DateTime dt = DateTime.Parse(string.Format("{0}-{1}-1", year, month)); 根据具体的DateTime来获取对应1号的星期。 int week = (int)dt.DayOfWeek; 由于是枚举类型,故而可以直接使用强转来处理类型的变化。我们可得到int类型的星期。
3、根据年月来计算当前月的最大天数是多少。
int monthsDay = DateTime.DaysInMonth(int.Parse(year), int.Parse(month)); 使用这个方法免去了计算闰年的过程。相对效率会高很多。
4、遍历的制表符t处理。
for (int i = 0; i < week; i ) { Console.Write("t"); } 这里我们使用的week是1号的具体星期,我们的星期排布方式是: "星期日t星期一t星期二t星期三t星期四t星期五t星期六t"
5、每星期换一次行。
for (int i = 0; i < monthsDay; i ) { Console.Write((i 1) "t"); if ((i week 1) % 7 == 0) { Console.WriteLine(); } } 可以看到在遍历的过程中对(i week 1)进行求余7的操作。如果结果是0直接换行即可。
效果示例:
输入年份与月份,得出当前月的万年月。
实际日历:
这个是从实际2023年2月的日历,与咱们遍历的是一致的,计算好对应的星期起始很重要。