今月は何日まであるか調べる

いわゆる「にしむくさむらい」の件です。うるう年も考慮するには、自分でルーチンを組んでも例外がいっぱいあってツライです。ライブラリの力を借りましょう。

GregorianCalendar クラスの GetDaysInMonth メソッドを用います。ちなみに、うるう年を判定するには IsLeapYear メソッドを使います。

うるう月、うるう日を判定するメソッドもありますが、何につかうのかわかりません。IsLeapMonth と IsLeapDay というメソッドです。

うるう年の判定のアルゴリズムはネットにたくさん説明があるのでそちらをご参照ください。国立天文台の解説が簡潔でわかりやすいです。暦については奥が深すぎるので私には解説しきれません。

いろいろ C# の標準クラスを調べて驚いたのがユリウス暦のクラスもあることです。グレゴリオ暦を導入する以前の日付を計算する場合はこれを使うとよいですが、歴史家とか、そういう人しか使わないのではと思います。

ユリウス通日を扱うライブラリは C# の標準ではありませんが有志の作った NodaTime というクラスでそれを扱うことができるらしいです。

		private void button1_Click( object sender, EventArgs e )
		{

			const int YEAR = 2024;

			StringBuilder sb = new StringBuilder();

			Calendar calendar = new GregorianCalendar();

			for ( int k = 1; k <= 12; k++ )
			{
				int month = k;
				int days_in_month = calendar.GetDaysInMonth( YEAR, month );
				String str_line = String.Format( "{0:d4}/{1:d2}/{2:d2}", YEAR, k, days_in_month );
				sb.AppendLine( str_line );
			}

			MessageBox.Show( sb.ToString().Trim() );

		}

		private void button2_Click( object sender, EventArgs e )
		{

			StringBuilder sb = new StringBuilder();

			Calendar calendar = new GregorianCalendar();

			for ( int k = 2010; k <= 2030; k++ )
			{
				int year = k;
				bool ret = calendar.IsLeapYear( year );
				sb.AppendLine( String.Format( "{0} is {1}", year, ret ) );
			}

			MessageBox.Show( sb.ToString().Trim() );

		}

		private void button3_Click( object sender, EventArgs e )
		{

			StringBuilder sb = new StringBuilder();

			const int YEAR_BASE = 2000;

			Calendar calendar = new GregorianCalendar();

			for ( int k = 0; k <= 10; k++ )
			{
				int year = YEAR_BASE + ( k * 100 );
				bool ret = calendar.IsLeapYear( year );
				sb.AppendLine( String.Format( "{0} is {1}", year, ret ) );
			}

			MessageBox.Show( sb.ToString().Trim() );

		}