一款简单的输出日历代码,相对于每次初始化DateTime然后调用DayOfWeek方法,这里的方法要效率高一些。每次获得月份的第一天是星期几,获得DayOfWeek的索引flag,然后根据flag的值判断是否需要补齐日历表格,最后循环输出日期的值。
using System;
namespace FirConsole
{
class MainClass
{
delegate void WriteLineDel(string message);
static event WriteLineDel writeEvent;
static event WriteLineDel WriteLineEvent;
static int padWidth = 10;
static char padChar = ' ';
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine("Input any month and press enter key!");
Console.WriteLine("Press y or Y to continue!");
writeEvent += (message) => { Console.Write(message); };
WriteLineEvent += (message) => { Console.WriteLine(message);};
string strContinue = "Y";
do
{
PrintDay();
strContinue = Console.ReadLine().ToUpper();
}
while (strContinue.Contains("Y"));
}
/// <summary>
/// Prints the current month of this year.
/// </summary>
static void PrintDay()
{
//var weekdays = new string[7] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
var weekdays = Enum.GetNames(typeof(DayOfWeek));
var sMonth = Console.ReadLine();
int iMonth = 1;// default value is first month.
if (int.TryParse(sMonth, out iMonth) == false)
iMonth = 1;
int year = DateTime.Now.Year;
int month = DateTime.Now.Month;
int day = DateTime.Now.Day;
DateTime tmpDateTime = new DateTime(year, iMonth, 1);
DayOfWeek dayOfWeek = tmpDateTime.DayOfWeek;
int flag = 0;
switch (dayOfWeek)
{
case DayOfWeek.Sunday:flag = 0;break;
case DayOfWeek.Monday:flag = 1;break;
case DayOfWeek.Tuesday:flag = 2;break;
case DayOfWeek.Wednesday:flag = 3;break;
case DayOfWeek.Thursday:flag = 4;break;
case DayOfWeek.Friday:flag = 5;break;
case DayOfWeek.Saturday:flag = 6;break;
}
for (int i = 0; i < weekdays.Length; i++)
{
writeEvent(weekdays[i].PadLeft(padWidth,padChar) + "\t");
}
WriteLineEvent("");
if (flag > 0)
{
for (int j = 0; j < flag; j++)
writeEvent("--".PadLeft(padWidth, padChar) + "\t");
}
int daysInMonth = DateTime.DaysInMonth(year, iMonth);
for (int i = 1; i <= daysInMonth; i++)
{
if (i == day && iMonth == month)
{
Console.ForegroundColor = ConsoleColor.Red;
writeEvent(i.ToString().PadLeft(padWidth, padChar) + "\t");
Console.ResetColor();
}
else
writeEvent(i.ToString().PadLeft(padWidth, padChar) + "\t");
if ((flag + i) % 7 == 0)
WriteLineEvent("");
}
WriteLineEvent("");
}
}
}
测试时间:2017年02月06日12:16:41
输出如下:
/*
Hello World!
Input any month and press enter key!
Press y or Y to continue!
1
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
y
2
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
-- -- -- 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
*/