输出今年指定月份的日历

一款简单的输出日历代码,相对于每次初始化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	

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值