请问如何合理计算续费时间

2017-02-28这个日期为时间节点,往后续费2个月,代码如下

// print 2017-04-28
echo date('Y-m-d', strtotime('+2 month', strtotime('2017-2-28')));

得到的结果少2天,那如果我人为将2月份续费的用户统一补2天时间,那在续费1年的正常情况下,又多出2天

// print 2018-02-28
echo date('Y-m-d', strtotime('+1 year', strtotime('2017-2-28')));

那么请问如何做到合理计算续费时间呢?

阅读 5.9k
4 个回答

这个问题是需求问题,不应该由程序员来解决。

制订业务需求的过程中,就必须明确,【时间】这个概念。不过大部分公平的包月计时原则,都是以30天作为一个月、365天作为一年来计算。

因为12 * 30 = 360,所以按月充值的用户,一年就少了5天时间;而按年充值的用户,一年就多获取5天时间。这些费用计算方法应该在合同里明示。

够一年的时间按照年计算:1年 2017-2-28 - 2018-2-28

不够一年按照30天计算: 1月 2017-2-28 - 2017-3-30

这样在单独开通12个月时有360天,把12月看作按年续费,少的那几天就当作赠送天数

我说下我个人想法,按照离月末的天数计算,若有更好的方法请补充答案,谢谢:

function xufei($add_num) 
{
    $month = date('m', time()) + 1;
    $limit = strtotime(sprintf('%s-%s-01', date('Y'), $month)) - 86400 - strtotime(date('Y-m-d', time()));
    
    $add_num += $month;
    return strtotime(sprintf('%s-%s-01', date('Y') + floor($add_num / 12), $add_num % 12)) - 86400 - $limit;
}

echo date('Y-m-d', xufei(5));   

这种需求最好是跟产品经理沟通。有些是按自然月算;有些按30天一个月算;还有些按31天算一个月。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题