0

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

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

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

但我的实际问题是,我想不出一个对应的公式来减去几个月。我尝试了各种事情,但一切都失败了,这让我发疯。所以任何帮助将不胜感激!

4

3 回答 3

2

这是我在@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

编辑:上面的原始答案假设了一个从零开始的月份计划,这似乎被一些人忽略了。为了避免混淆,我们当然可以使用更直观的从 1 开始的月份方案,并在计算过程中进行 0 基转换(虽然它使计算稍微混乱):

year = 2012;  // year 2012
month = 7;    // July
monthToAdd = -20;  // +ve/-ve means add/subtract

resultYear = (year * 12 + (month - 1) + monthToAdd) /12;
resultMonth = ((year * 12 + (month - 1) + monthToAdd) mod 12) + 1

// resultYear == 2010
// resultMonth == 11  , which means November
于 2012-07-16T07:43:27.897 回答
1

一种可能的解决方案是乘以OldYear12(从而将其转换为月份),分别添加或减去AddMonthsor SubMonths,然后转换回NewYearNewMonth使用整数和模除法(取决于您的编程语言,您可以简化这个)。

于 2012-07-16T07:35:23.337 回答
-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)
于 2020-12-21T23:36:17.247 回答