C#中的年,月和日的日期时间差异

DateTime difference in Years, Months and Days in C#

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

假设我有两个日期时间对象,一个表示今天的日期,另一个表示用户提供的出生日期。

我想在两个日期之间做一个简单的计算差异,并以以下格式输出一个字符串:

17年-2个月-18天

数字就是例子。我怎样才能在C中实现这一点?

编辑:

是的,我尝试过各种组合,但我只能这样得到年份差异:

1
2
3
4
5
6
7
8
DateTime userDate = SuppliedDate;
int userAge = DateTime.Now.Year - userDate.Year;
DateTime today = DateTime.Now;
if (userDate > today.AddYears(-userAge))
{
    userAge--;
}
Age.Text = userAge.ToString() +" years";

谢谢您。


这是一个比看上去更棘手的问题;年份的天数(闰年)和月份(28、29、30或31)都是可变的。因此,为了获得您想要的输出,您必须在出生日期和当前日期之间的每年和每月进行检查,检查闰年状态、每个月的天数,并随着时间的推移不断增加。

如其他答案所指出的,第一步是使用TimeSpan结构来获得一个人的总寿命。这是容易的部分

1
2
3
var dob = new DateTime(1962,5,20);
var age = DateTime.Today.Subtract(dob.Date); // May as well use midnight's
var totalDays = age.TotalDays;

从这里开始,您需要从出生年份(本例中是1962年)开始计算年份,直到当前年份。每过一年,从总数中减去365天(如果是闰年,则减去366天)。

当您在当前日期的一年内到达时,开始计算月份,然后再次从剩余的总天数中减去正确的数字。

当您在当前日期的一个月内到达时,剩下的部分就是字符串的最后一部分。

当我有机会的时候,我会使用上面的伪代码的一个有效版本,但是我希望这会给你一个指向正确方向的指针。


只需将时间跨度转换回日期时间:

1
2
3
4
        var test = DateTime.Now;
        var test2 = DateTime.Now;
        var result = test - test2;
        DateTime resultDate = DateTime.MinValue + result;


如果您需要此套房,请尝试:

1
DateTime dt3 = new DateTime((dt2 - dt1).Ticks);

您必须更正所有值(年、月、日)都太多。


当你从C中的另一个减去一个Date时,你会得到一个TimeSpan结构。

时间跨度并不是用来给你几个月或几年的,即使有一个自定义的格式字符串。

这意味着您必须根据可用的属性手动计算年和月,最大的属性是天,但精度要低得多。


你可以使用这样的东西:

1
2
3
var userDate = new DateTime(1980, 5, 3);
var dateDif = DateTime.Now.Subtract(userDate);
string output = dateDif.ToString("yy Years - MM Months - dd Days");