关于c#:如何将天数转换为年,月和日

How to convert number of days to years,months and days

本问题已经有最佳答案,请猛点这里访问。

如果我有两个约会,那么我会在像这样的日子里得到它们之间的区别。

如何在以下视图中详细说明:

将天数转换为(number of years,number of months and the rest in the number of days)


没有现成的解决方案。问题是数据不是"固定的",例如并非所有年份都是365天(闰年为366天),并且并非每个月都可以假定为标准的30天。

在没有上下文的情况下计算这种信息是非常困难的。但是,您有一个以天为单位的持续时间,以准确计算您需要确切知道这些天何时到来的年/月数,即在哪个月和哪个年——这将允许您确定月份和/或年份中的确切日期。


根据您的意见和以下条件

  • 1年=365天
  • 1个月=30天

那么下面的代码就可以完成这项工作了

1
2
3
4
5
6
7
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);


正如前面的答案中提到的,很难从几天内解决这个问题。闰年和月份天数存在问题。如果以最初的两个日期开始,则可以使用类似于以下内容的代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
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)


你不能,因为这取决于开始日期即30天可以是1个月1天,或1个月2天,或少于1个月或如果是闰年,365天不到一年