使用简单的数学加减月数

时间:2012-07-16 06:50:36

标签: math

我正在寻找数学公式来添加和减去日期的月份。我只需要知道年月,因此可以忽略几天。

这是我提出的添加月伪代码:

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重新调整的需要。

但我的实际问题是,我无法想出相应的公式来减去数月。我尝试了各种各样的东西,但一切都失败了,它让我疯狂。所以任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将OldYear乘以12(从而将其转换为数月),分别添加或减去AddMonthsSubMonths,然后转换回{{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)