3

想象一下,我有两个 DateTime 对象,一个代表今天的 date,另一个代表用户提供的 date ofbirth

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

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

谢谢你。

4

5 回答 5

6

只需将 TimeSpan 转换回 Datetime:

        var test = DateTime.Now;
        var test2 = DateTime.Now;
        var result = test - test2;
        DateTime resultDate = DateTime.MinValue + result;
于 2013-05-17T08:25:37.137 回答
2

这是一个比最初看起来更棘手的问题。年份的天数(闰年)和月份(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 天)。

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

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

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

于 2013-05-17T08:51:25.923 回答
0

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

TimeSpan 的设计目的不是为您提供几个月或几年的时间——即使使用自定义格式字符串也是如此。

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

于 2013-05-17T08:29:40.753 回答
0

试试这是否适合您的需求:

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

您必须更正所有值(年、月、日)是否过大。

于 2013-05-17T08:36:04.893 回答
-4

你可以使用这样的东西:

var userDate = new DateTime(1980, 5, 3);
var dateDif = DateTime.Now.Subtract(userDate);
string output = dateDif.ToString("yy Years - MM Months - dd Days");
于 2013-05-17T08:33:28.060 回答