如何获得两个日期之间的年/月/周/日的差异?
如何获得两个日期之间的年/月/周/日的差异?
如何以高效的方式获取两个日期之间的年/月/周/日差异?
例如,两个日期之间的差异是1年,2个月,3周,4天。
差异表示两个日期之间的年数、月数、周数和天数的计数。
admin 更改状态以发布 2023年5月21日
这实际上相当棘手。不同的天数总和可能会导致相同的结果。例如:
-
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;
(建议您避免甚至思考负面时期-确保一切都是积极的。