C# 以年、月和日为单位的日期时差(C)#

C# 以年、月和日为单位的日期时差(C)#,c#,datetime,C#,Datetime,假设我有两个DateTime对象,一个表示今天的日期,另一个表示用户提供的出生日期 我想简单计算两个日期之间的差值,并以以下格式输出一个字符串: 17年-2个月-18天 这些数字只是例子。如何在C#中实现这一点 编辑: 是的,我尝试过各种组合,但我只能得到这样的年差: DateTime userDate = SuppliedDate; int userAge = DateTime.Now.Year - userDate.Year; DateTime today = DateTime.Now; i

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

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

17年-2个月-18天

这些数字只是例子。如何在C#中实现这一点

编辑:

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

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";

谢谢。

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

        var test = DateTime.Now;
        var test2 = DateTime.Now;
        var result = test - test2;
        DateTime resultDate = DateTime.MinValue + result;

当你在C#中从另一个日期中减去一个
日期时,你会得到一个
TimeSpan
结构

时间跨度的设计并不是为了给你几个月或几年的时间,即使有一个


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

您可以使用以下内容:

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

如果这符合您的需要,请尝试:

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

您必须纠正所有值(年、月、日)过多。

这是一个比最初看起来更棘手的问题;年和月(28、29、30或31)有不同的天数(闰年)。因此,为了获得您想要的输出,您必须在出生日期和当前日期之间的每年和每月进行检查,检查闰年状态、每个月的天数并随时间递增

正如其他答案所指出的,第一步是使用
TimeSpan
struct获取一个人的总出生天数。这是最简单的部分

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天)

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

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


如果有机会,我将使用上述伪代码的一个有效版本,但我希望这会给您一个正确的方向。

到目前为止您是否尝试过任何东西?请尝试选中此项。对于这个问题,有一些解决方案:@IlyaIvanov yep,更新了Q以显示我的尝试。尝试使用真实的出生日期。你真的尝试过这个吗?天哪,有人投了这个票,这有用吗?日期差是一个
时间跨度
,其中包含年份@是的,有人投了这个垃圾票。我用一个倒计时来反驳它,并演示了代码实际上没有编译!您不能设置这样的时间跨度格式。导致格式化异常。