2天之间的年、月和日的差异

5

我需要输出两天之间的年、月和日的差异。

使用 timespan 和 subtract 只能得到天数,但是否可以输出年、月和日呢?

这是我目前的代码:

public string Leeftijdsverschil(DateTime p1, DateTime p2)
{
    if (p1 > p2)
    {
        DateTime verschil = p1.Subtract(TimeSpan.FromTicks(p2.Ticks));
        return verschil.ToString();
    }
    else
    {
        DateTime verschil = p2.Subtract(TimeSpan.FromTicks(p1.Ticks));
        return verschil.ToString();
    }
}

2
这里的逻辑似乎有很大问题。 - leppie
嗯,一年有多少天?365.25还是你在考虑闰年等因素? - Belogix
变量verschil应该是一个TimeSpan,而不是一个DateTime - Patrick Hofman
TimeSpan.FromTicks(p2.Ticks)TimeSpan不能容纳DateTime的所有值。 - Sriram Sakthivel
@AndyKorneyev:那个问题只涉及年份 - 而且被接受的答案不能特别简单地处理月份/天数。 - Jon Skeet
2个回答

13

.NET类型无法给你一个合适的答案,除非你编写代码尝试一种答案并进行相应的调整,但我的Noda Time项目旨在处理这种情况。例如:

LocalDate x = new LocalDate(2013, 5, 21);
LocalDate y = new LocalDate(2014, 12, 15);
Period p = Period.Between(x, y);
Console.WriteLine("{0} {1} {2}", p.Years, p.Months, p.Days);

结果:

1 6 24
(即1年、6个月和24天) 如果您决定使用 Noda Time 来实现这个功能,您可以在方法内部完成,但通常更好的做法是更广泛地利用 Noda Time。目标是让它比仅使用 DateTime 更清晰明了。

2
直接减去即可得到增量:
var delta = p1 - p2;

这将为您提供一个TimeSpan。从那里,您可以访问.Days。然而,月份和年份要复杂得多。如果您想要以这些术语的差异,您必须直接比较p1p2的属性(或:如Jon所说:使用Noda Time)。


由于闰年和月份的存在,这是不可能的。想象一下,如果你的生日是在2月29日,你必须进行完整的日期计算。 - Panagiotis Kanavos
1
@PanagiotisKanavos,请明确告诉我哪一位是“不可能”的。日期相减肯定是可以的。正如我所指出的,获取年/月差异更加复杂,但仍然绝对可行。 - Marc Gravell
通过TimeSpan获得这种差异是不可能的,如果你跨越了一个月的阈值。在每种情况下,您需要比较天数、月份和年份。 - Panagiotis Kanavos
@PanagiotisKanavos 没错;这就是为什么我说“然而,月份和年份要复杂得多。如果您想在这些术语上获得差异,您将不得不直接比较p1和p2的属性”。 - Marc Gravell
不否认这一点,这就是TimeSpan的作用,为什么简单的差异不足以解决问题。这是一种不同的算术 - 通常在小学教授。每个值的每个元素都有不同的基数和进位。我仍然记得我在四年级尝试计算我的年龄,试图将年转换为分钟而失败了。 - Panagiotis Kanavos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接