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'
拜托大神了 展开
我用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'
拜托大神了 展开
展开全部
/**
* 返回某个时间几月前或及月后的时间戳
* @$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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/****
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);
}
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<?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行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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)
}
$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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询