2 つの日付がある場合、この投稿のように、それらの差を日数で取得します。
次のビューでそれを詳しく説明する方法:
number of years,number of months and the rest in the number of days
日を ( )に変換する
これにはすぐに使えるソリューションはありません。問題は、データが「固定」されていないことです。たとえば、すべての年が 365 日 (うるう年は 366 日) であるとは限らず、毎月が標準の 30 日であると想定できるわけではありません。
コンテキストなしでこの種の情報を計算することは非常に困難です。ただし、年数/月数を正確に計算するには、これらの日がいつ、つまり何月何年になるかを正確に知る必要があります。これにより、月の正確な日および/または年。
あなたのコメントと次の条件に基づいて
次に、次のコードが仕事をします
DateTime startDate = new DateTime(2010, 1, 1);
DateTime endDate = new DateTime(2013, 1, 10);
var totalDays = (endDate - startDate).TotalDays;
var totalYears = Math.Truncate(totalDays / 365);
var totalMonths = Math.Truncate((totalDays % 365) / 30);
var remainingDays = Math.Truncate((totalDays % 365) % 30);
Console.WriteLine("Estimated duration is {0} year(s), {1} month(s) and {2} day(s)", totalYears, totalMonths, remainingDays);
開始日に依存するため、できません。つまり、30 日は 1 か月 1 日、1 か月 2 日、または 1 か月未満、365 日はうるう年の場合は 1 年未満になります。
以前の回答で述べたように、数日だけでこれを解決するのは非常に困難です。うるう年と月の日数に問題があります。元の 2 つの日時から開始する場合は、次のようなコードを使用できます。
DateTime date1 = new DateTime(2010, 1, 18);
DateTime date2 = new DateTime(2013, 2, 22);
int oldMonth = date2.Month;
while (oldMonth == date2.Month)
{
date1 = date1.AddDays(-1);
date2 = date2.AddDays(-1);
}
int years = 0, months = 0, days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0;
// getting number of years
while (date2.CompareTo(date1) >= 0)
{
years++;
date2 = date2.AddYears(-1);
}
date2 = date2.AddYears(1);
years--;
// getting number of months and days
oldMonth = date2.Month;
while (date2.CompareTo(date1) >= 0)
{
days++;
date2 = date2.AddDays(-1);
if ((date2.CompareTo(date1) >= 0) && (oldMonth != date2.Month))
{
months++;
days = 0;
oldMonth = date2.Month;
}
}
date2 = date2.AddDays(1);
days--;
TimeSpan difference = date2.Subtract(date1);
Console.WriteLine("Difference: " +
years.ToString() + " year(s)" +
", " + months.ToString() + " month(s)" +
", " + days.ToString() + " day(s)");
出力は次のとおりです。Difference: 3 year(s), 1 month(s), 4 day(s)