2013-05-17 24 views
1

想象一下,我有两个DateTime对象,一个代表今天的日期,另一个代表用户提供的出生日期C#中的年,月和日的时间差异

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

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

到目前为止,你有尝试过什么吗? –

+0

尝试对此进行检查。有这个问题的一些解决方案:http://www.pressthered.com/datediff_equivalent_in_c_-_3_options/ – Jakub

+0

@IlyaIvanov是的,更新Q显示我已经尝试过。 – Ciwan

回答

4

这比第一次看起来更棘手的问题;年份与月份(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天)。

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

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

我会为上面的伪代码工作,当我有机会时,但我希望这给你一个正确方向的指针。

3

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

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

试试用真实的出生日期 – Steve

0

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

TimeSpans的设计不是为了给你几个月或几年 - 即使是custom format string

这意味着您将不得不根据可用属性手动计算年份和月份,其中最大值为几天,但会降低到更低的精度。

-3

您可以使用财产以后这样的:

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

你真的尝试过吗? [它不起作用!](http://rextester.com/UKFQO41334) – Jamiec

+0

Pheww做了一个upvote这个,这是否工作?日期的差异是一个'Timespan'和一个拥有几年的日期! ! – V4Vendetta

+0

@ V4Vendetta - 是的,有人确实加入了这个垃圾。我反驳了它,并且演示了代码实际上不会编译! – Jamiec

0

尝试,如果这符合您需求:

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

你将不得不修正是一个太大的所有值(年,月,日)许多。

相关问题