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

46 浏览
0 Comments

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

如何以高效的方式获取两个日期之间的年/月/周/日差异?

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

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

这实际上相当棘手。不同的天数总和可能会导致相同的结果。例如:

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

  • 2006年6月19日至2008年6月19日=2年,但由于闰年的存在,天数也会是365 + 366天

您可能希望减去年份,直到您得到两个日期间隔少于一年的点。然后减去几个月,直到您得到两个日期间隔少于一个月的点。

更混乱的是:如果您的起始日期是“3月30日”,那么减去(或添加)月份会很棘手,什么是比它早一个月的日期?

更混乱的是(可能与此问题无关):即使一天也不总是24小时。夏令时呢?

更混乱的是(几乎肯定与此问题无关):甚至一分钟也不总是60秒。闰秒非常令人困惑......

我现在没有时间找出确切正确的方法-这个答案主要是为了提出这个问题并不像听起来的那么简单。

编辑:很遗憾,我没有足够的时间完全回答这个问题。我建议您首先定义一个表示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/second值的first + (Period.Difference(first,second)) == second

首先编写大量单元测试-最初是“易于”案例,然后转向涉及闰年的棘手案例。我知道一般的方法是一次只编写一个测试,但在您开始任何实现工作之前,我个人会先集思广益。

给自己留一天时间来适当地实现这个。这很棘手。

请注意,我在这里忽略了周数-该值至少很容易,因为它始终是7天。因此,给定(正数)期间,您将拥有:

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

(建议您避免甚至思考负面时期-确保一切都是积极的。

0