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

时间:2013-05-17 08:19:30

标签: c# datetime

想象一下,我有两个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";

谢谢。

5 个答案:

答案 0 :(得分:3)

只需将TimeSpan转换回日期时间:

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

答案 1 :(得分:3)

这比最初看起来更棘手;年数(闰年)可变天数(28,29,30或31)。因此,为了获得您想要的输出,您必须跨越出生日期和当前日期之间的每年和每月,检查闰年状态,每个月的天数以及随时递增。

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

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

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

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

我将有机会使用上述伪代码的工作版本,但我希望这会给你一个指向正确方向的指针。

答案 2 :(得分:0)

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

TimeSpans并非旨在为您提供数月或数年 - 即使使用custom format string

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

答案 3 :(得分:0)

尝试满足您的需求:

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

您必须更正所有值(年,月,日)过多。

答案 4 :(得分:-5)

您可以使用以下内容:

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