小编典典

如何获得年/月/周/日中两个日期之间的差异?

c#

如何有效地获取年/月/周/日中两个日期之间的差异?

例如。两个日期之间的差值为1年,2个月,3周,4天。

差异表示两个日期之间的年,月,周和天的计数。


阅读 272

收藏
2020-05-19

共1个答案

小编典典

这实际上很棘手。总天数不同可以得到相同的结果。例如:

  • 2008年6月19日至2010年6月19日= 2年,但也为365 * 2天

  • 2006年6月19日至2008年6月19日= 2年,但由于leap年也需要365 + 366天

您可能要减去几年,直到到达两个相距不到一年的日期为止。然后减去数月,直到达到两个相距不到一个月的日期为止。

进一步的混乱:如果您可能以“ 3月30日”作为开始日期,那么减去(或增加)月份会很棘手-比那早一个月?

更进一步的混乱( 可能 无关紧要):甚至一天也不总是24小时。夏令时有人吗?

更进一步的混乱(几乎可以肯定是 相关的):一分钟并不总是60秒。ap秒令人非常困惑…

我现在没有时间来确定执行此操作的正确方法-这个答案主要是为了提出一个事实,即它听起来并不简单。

编辑:不幸的是,我将没有足够的时间来完全回答这个问题。我建议您从定义代表的结构开始Period

public struct Period
{
    private readonly int days;
    public int Days { get { return days; } }
    private readonly int months;
    public int Months { get { return months; } }
    private readonly int years;
    public int Years { get { return years; } }

    public Period(int years, int months, int days)
    {
        this.years = years;
        this.months = months;
        this.days = days;
    }

    public Period WithDays(int newDays)
    {
        return new Period(years, months, newDays);
    }

    public Period WithMonths(int newMonths)
    {
        return new Period(years, newMonths, days);
    }

    public Period WithYears(int newYears)
    {
        return new Period(newYears, months, days);
    }

    public static DateTime operator +(DateTime date, Period period)
    {
        // TODO: Implement this!
    }

    public static Period Difference(DateTime first, DateTime second)
    {
        // TODO: Implement this!
    }
}

我建议您首先实现+运算符,该运算符应告知Difference方法-您应确保first + (Period.Difference(first, second)) == second所有first/ second值都使用该运算符。

首先编写大量的单元测试-
最初是“简单”的案例,然后再进行涉及leap年的棘手案例。我知道通常的方法是一次编写一个测试,但是在您开始执行任何实现工作之前,我个人都会进行头脑风暴。

给自己一天时间来正确实施此操作。这是棘手的东西。

请注意,我在这里省略了几周-至少很容易获得该值,因为它总是7天。因此,给定一个(正)期间,您将拥有:

int years = period.Years;
int months = period.Months;
int weeks = period.Days / 7;
int daysWithinWeek = period.Days % 7;

(我建议您甚至不要考虑消极的时期-确保所有时间都是积极的。)

2020-05-19