using System;
class Sample {
// 基準日baseDayからdayまでの経過月数を求める
// (DateTimeの時間部分に付いては考慮しない)
public static int GetElapsedMonths(DateTime baseDay, DateTime day)
{
if (day < baseDay)
// 日付が基準日より前の場合は例外とする
throw new ArgumentException();
// 経過月数を求める(満月数を考慮しない単純計算)
var elapsedMonths = (day.Year - baseDay.Year) * 12 + (day.Month - baseDay.Month);
if (baseDay.Day <= day.Day)
// baseDayの日部分がdayの日部分以上の場合は、その月を満了しているとみなす
// (例:1月30日→3月30日以降の場合は満(3-1)ヶ月)
return elapsedMonths;
else if (day.Day == DateTime.DaysInMonth(day.Year, day.Month) && day.Day <= baseDay.Day)
// baseDayの日部分がdayの表す月の末日以降の場合は、その月を満了しているとみなす
// (例:1月30日→2月28日(平年2月末日)/2月29日(閏年2月末日)以降の場合は満(2-1)ヶ月)
return elapsedMonths;
else
// それ以外の場合は、その月を満了していないとみなす
// (例:1月30日→3月29日以前の場合は(3-1)ヶ月未満、よって満(3-1-1)ヶ月)
return elapsedMonths - 1;
}
// 基準日baseDayからdayまでの経過年数を求める
public static int GetElapsedYears(DateTime baseDay, DateTime day)
{
// 経過月数÷12(端数切り捨て)したものを経過年数とする
// (満12ヶ月で満1年とする)
return GetElapsedMonths(baseDay, day) / 12;
}
static void Main()
{
var baseDay = new DateTime(2012, 1, 30);
Console.WriteLine("基準日: {0:D}", baseDay);
foreach (var day in new[] {
new DateTime(2012, 1, 31),
new DateTime(2012, 2, 28),
new DateTime(2012, 2, 29),
new DateTime(2012, 3, 29),
new DateTime(2012, 3, 30),
new DateTime(2012, 3, 31),
new DateTime(2012, 4, 29),
new DateTime(2012, 4, 30),
new DateTime(2013, 1, 29),
new DateTime(2013, 1, 30),
}) {
Console.WriteLine("日付: {0:D}, 経過月数: {1}", day, GetElapsedMonths(baseDay, day));
}
baseDay = new DateTime(2011, 6, 18);
Console.WriteLine("基準日: {0:D}", baseDay);
foreach (var day in new[] {
new DateTime(2012, 6, 17),
new DateTime(2012, 6, 18),
new DateTime(2015, 6, 17),
new DateTime(2015, 6, 18),
}) {
Console.WriteLine("日付: {0:D}, 経過年数: {1}", day, GetElapsedYears(baseDay, day));
}
baseDay = new DateTime(2012, 2, 29);
Console.WriteLine("基準日: {0:D}", baseDay);
foreach (var day in new[] {
new DateTime(2012, 3, 28),
new DateTime(2012, 3, 29),
new DateTime(2013, 2, 27),
new DateTime(2013, 2, 28),
new DateTime(2013, 3, 1),
new DateTime(2016, 2, 28),
new DateTime(2016, 2, 29),
}) {
Console.WriteLine("日付: {0:D}, 経過月数: {1}, 経過年数: {2}", day, GetElapsedMonths(baseDay, day), GetElapsedYears(baseDay, day));
}
}
}