如何有效地获取年/月/周/日中两个日期之间的差异?
例如。两个日期之间的差值为1年,2个月,3周,4天。
差异表示两个日期之间的年,月,周和天的计数。
这实际上很棘手。总天数不同可以得到相同的结果。例如:
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:
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值都使用该运算符。
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;
(我建议您甚至不要考虑消极的时期-确保所有时间都是积极的。)