我正在寻找数学公式来添加和减去日期的月份。我只需要知道年月,因此可以忽略几天。
这是我提出的添加月伪代码:
OldYear = 2012 // current year
OldMonth = 3 // current month
AddMonths = 0 // the months to be added
FooBar = OldMonth + AddMonths
NewYear = OldYear + FooBar / 12
NewMonth = FooBar % 12
IF NewMonth = 0
NewYear = NewYear - 1
NewMonth = 12
END IF
// set AddMonths to 0 and the result will be 2012.03
// set AddMonths to 6 and the result will be 2012.09
// set AddMonths to 9 and the result will be 2012.12
// set AddMonths to 11 and the result will be 2013.02
// set AddMonths to 23 and the result will be 2014.02
// set AddMonths to 38 and the result will be 2015.05
并且效果非常好,但还有更好的方法吗?我真的不喜欢IF NewMonth = 0重新调整的需要。
但我的实际问题是,我无法想出相应的公式来减去数月。我尝试了各种各样的东西,但一切都失败了,它让我疯狂。所以任何帮助都会非常感激!
答案 0 :(得分:1)
一种可能的解决方案是将OldYear
乘以12(从而将其转换为数月),分别添加或减去AddMonths
或SubMonths
,然后转换回{{1通过使用整数和模块化除法和NewYear
(取决于您的编程语言,您可以简化这一点)。
答案 1 :(得分:1)
这是我对@Matt答案和@Matt
答案的评论的组合如果采用基于0的月计划,公式可以大大减少。
伪代码:
year = 2012; // year 2012
month = 6; // July (NOT June)
monthToAdd = -20; // +ve/-ve means add/subtract
resultYear = (year * 12 + month + monthToAdd) /12;
resultMonth = (year * 12 + month + monthToAdd) mod 12;
// resultYear == 2010
// resultMonth == 10 , which means November
答案 2 :(得分:-1)
完全归功于 Adrian Shum 构建的主要逻辑,但我认为存在一种边缘情况,即对于我们返回的月份数与我们所在月份相同的情况,代码不是 100% 准确的。例如,如果我们在 3 月,然后返回 3 个月,我们应该在 12 月(2 月、1 月和 12 月)结束。
这是修改后的版本:
year = 2020;
month = 4;
monthToAdd = -1;
resultYear = (year * 12 + month + monthToAdd) /12;
resultMonth = (year * 12 + month + monthToAdd) % 12;
if month+monthToAdd == 0:
resultMonth=12
elif (abs(monthToAdd)%month)==0:
resultMonth=month
print(resultMonth)
print(resultYear)