想象一下,我有两个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";
谢谢。
答案 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");