php 指定时间退后或提前N个月的函数怎么写 20

比如时间2014-03-01退后一个月变成2014-04-01,提前一个月变成2014-02-01我用strtotime来做加减,但是有个问题,比如2014-03-31,... 比如时间2014-03-01 退后一个月变成2014-04-01,提前一个月变成2014-02-01
我用strtotime来做加减,但是有个问题,比如2014-03-31,提前一个月我想让他变成2014-02-28
但是实际变成了2014-03-03
另外还得考虑闰年2月29天的情况, 比如2000-03-31,提前一个月变成2000-02-29
应该怎么解决

能不能给我写个函数
DateCount(vDate,vNum,vType)
vDate 是指定时间,如2014-01-01格式,如果为空就是当前时间
vNum 是加减的数量,如果是负数就是提前,正数就是延后
vType 是加减类型,'day','month','year'

拜托大神了
展开
 我来答
创作者UJHw7QCE6T
2018-03-29
知道答主
回答量:12
采纳率:0%
帮助的人:8080
展开全部
    /** 
     * 返回某个时间几月前或及月后的时间戳 
     * @$datetime 指定时间戳
     * @$num 增减月份(1,-2)
     * @return datetime 
     */  
    public static function getEveryMonth($datetime,$num){
        $year_month = date("Y-m",$datetime);
        $time_day = date("d",$datetime);
        $H = date("H",$datetime);
        $i = date("i",$datetime);
        $s = date("s",$datetime);
        
        if($num>0){
            $act = "+".abs($num)." month";
        }else{
            $act = "-".abs($num)." month";
        }
        $time = strtotime($act,strtotime($year_month));
        $time_str = date("Y-m-d",$time);
        
        if(date("t",$time)>$time_day){
            $return_time = mktime($H,$i,$s,date("m",$time),date("d",$time),date("Y",$time));
        }else{
            $return_time = mktime($H,$i,$s,date("m",$time),date("t",$time),date("Y",$time));
        }
        return $return_time;  
    }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a443a3b35
2014-11-25 · TA获得超过309个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:203万
展开全部
/****
vDate 是指定时间,如2014-01-01格式,如果为空就是当前时间
vNum 是加减的数量,如果是负数就是提前,正数就是延后
vType 是加减类型,'day','month','year'
*/
function DateCount($vDate,$vNum,$vType){
if(empty($vDate)){
$vDate=date("Y-m-d");
}
$vNum=intval($vNum);
if(empty($vNum)){
return $vDate;
}
$vNumstr="+".abs($vNum);
if($vNum<0){
$vNumstr="-".abs($vNum);
}
$time=strtotime($vDate);
if($vType=="year"){
$time=strtotime("$vNumstr years",$time);
}elseif($vType=="month"){
$time=strtotime("$vNumstr month",$time);
}elseif($vType=="day"){
$time=strtotime("$vNumstr days",$time);
}else{
return false;
}
return date("Y-m-d",$time);
}
追问
不对呀
测试 DateCount('2000-01-31',1,'month');
的结果是2000-03-02
我想要的结果是 2000-02-29
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
简维维维维维维维9u
2014-12-02
知道答主
回答量:12
采纳率:0%
帮助的人:2.4万
展开全部
<?php
function datecount($vdate,$vnum,$vtype){
$day = date('j',strtotime($vdate));
$month = date('n',strtotime($vdate));
$year = date('Y',strtotime($vdate));
switch($vtype){
case 'day':
if($vnum >= 0){
$day = $day + abs($vnum);
}else{
$day = $day - abs($vnum);
}
break;
case 'month':
if($vnum >= 0){
$month = $month+ abs($vnum);
}else{
$month = $month- abs($vnum);
}
$next = getDays($month,$year);//获取变换后月份的总天数
if($next<$day){
$day = $next;
}
break;
case 'year':
if($vnum >= 0){
$year = $year+ abs($vnum);
}else{
$year = $year - abs($vnum);
}
break;
default :

break;
}
$time = mktime(0,0,0,$month,$day,$year);
return date('Y-m-d',$time);
}

function getDays($month,$year){//获取给定月份的天数
switch($month){
case '1':
case '3':
case '5':
case '7':
case '8':
case '10':
case '12':
return 31;
break;
case '4':
case '6':
case '9':
case '11':
return 30;
break;
case '2':
if(($year%4==0 && $year%100!=0) || $year%400==0){//整百的年份要同时满足400的倍数才算闰年
return 29;
}else{
return 28;
}
break;
}
}
echo  datecount('2000-01-31',1,'month');

亲测,可用,关键逻辑是21-23行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
莘赡05V
2014-11-25 · 知道合伙人软件行家
莘赡05V
知道合伙人软件行家
采纳数:1397 获赞数:3710
毕业安徽理工大学

向TA提问 私信TA
展开全部
function datecount($vdate,$vnum,$vtype){
$day = date('d',strtotime($vdate));
$month = date('n',strtotime($vdate));
$year = date('Y',strtotime($vdate))
switch($vtype){
case 'day':
if($vnum >= 0){
$day = $day + abs($vnum);
}else{
$day = $day - abs($vnum);
}
break;

case 'month':
if($vnum >= 0){
$day = $month+ abs($vnum);
}else{
$day = $month- abs($vnum);
}
break;

case 'year':
if($vnum >= 0){
$day = $year+ abs($vnum);
}else{
$day = $year - abs($vnum);
}
break;
default :

break;
}
$time = mktime(0,0,0,$month,$year,$year);
return date('Y-m-d',$time)

}
更多追问追答
追问
你有测试过么,错的好远啊
测试 DateCount('2000-01-31',1,'month');

结果居然是2005-06-22
追答
<?php
function datecount($vdate,$vnum,$vtype){
    $day = date('j',strtotime($vdate));
    $month = date('n',strtotime($vdate));
    $year = date('Y',strtotime($vdate));
    switch($vtype){
        case 'day':
           if($vnum >= 0){
                    $day = $day + abs($vnum);
                }else{
                    $day = $day - abs($vnum);
            }
        break;
        case 'month':
           if($vnum >= 0){
                    $month = $month+ abs($vnum);
                }else{
                    $month = $month- abs($vnum);
            }
        break;
        case 'year':
           if($vnum >= 0){
                    $year = $year+ abs($vnum);
                }else{
                    $year = $year - abs($vnum);
            }
        break;
        default :

            break;
    }
    $time = mktime(0,0,0,$month,$day,$year);
    return date('Y-m-d',$time);
}

echo  datecount('2000-01-31',1,'month');

刚才是直接写的,有些变量写错了。比喻最后一句的mktime本来是$day.我写成了$year,所以加了2000天,这个我测过了2000-03-02

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式