PHP实现指定时间的n月之前的这一天的两种算法

/**
*根据$endtime,返回指定$monthes月之前的日
*/
function severalMonthAgo($endtime,$monthes){
if (!$endtime) {
	return false;
}
if (!is_int($monthes) || $monthes <=0) {
	return false;
}

$m = date("m",$endtime);
$y = date("Y",$endtime);
$d = date("d",$endtime);
$year = floor($monthes/12);
$monthes_mod = $monthes%12;
if($year == 0){
//<12个月
	if($m < $monthes){
		//当前月份小于n月前
		$res_y = $y-1;
		$res_m = 12-($monthes-$m);
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
			$res_d = $d;
		}else{
			$res_d = $t;
		}
	}elseif($m == $monthes){
		$res_y = $y-1;
		$res_m = 12;
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
			$res_d = $d;
		}else{
			$res_d = $t;
		}
	}elseif($m>$monthes){
		$res_y = $y;
		$res_m = $m-$monthes;
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
			$res_d = $d;
		}else{
			$res_d = $t;
		}
	}
}elseif($year>0){
	$y = $y-$year;
	$monthes = $monthes_mod;
	if($m < $monthes){
		//当前月份小于n月前
		$res_y = $y-1;
		$res_m = 12-($monthes-$m);
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
			$res_d = $d;
		}else{
			$res_d = $t;
		}
	}elseif($m == $monthes){
		$res_y = $y-1;
		$res_m = 12;
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
			$res_d = $d;
		}else{
			$res_d = $t;
		}
	}elseif($m>$monthes){
		$res_y = $y;
		$res_m = $m-$monthes;
		$t = date("t",strtotime($res_y."-".$res_m."-01"));
		if($d<$t){
		$res_d = $d;
		}else{
			$res_d = $t;
		}
	}
}
return strtotime($res_y."-".$res_m."-".$res_d);
}

/**
*根据$endtime,返回指定$monthes月之前的日
*/
function severalMonthAgoEx($endtime,$monthes){
if (!$endtime) {
	return false;
}
if (!is_int($monthes) || $monthes <=0) {
	return false;
}

$m = date("m",$endtime);
$y = date("Y",$endtime);
$d = date("d",$endtime);

$year = floor($monthes/12);
$monthes_mod = $monthes%12;
$y -= $year;
//$year =0或>0;
//$monthes_mod =0或>0或
if ($year>0) {
	if ($monthes_mod>0) {
		$m_diff = 12+$m-$monthes_mod;
		$m_diff_div = floor($m_diff/12);
		$m_diff_mod = $m_diff%12;
		if ($m_diff_div > 0) {
			$res_y = $y;
			$res_m = $m_diff_mod;
		}elseif ($m_diff_div == 0) {
			$res_y = $y -1;
			$res_m = $m_diff_mod;
		}
	}elseif ($monthes_mod==0) {
		//整除
		$res_y = $y;
		$res_m = $m;

	}
}elseif ($year == 0) {
	$m_diff = 12+$m-$monthes_mod;
	$m_diff_div = floor($m_diff/12);
	$m_diff_mod = $m_diff%12;
	if ($m_diff_div > 0) {
		$res_y = $y;
	}elseif ($m_diff_div == 0) {
		$res_y = $y -1;
	}
	$res_m = $m_diff_mod;
}

$t = date("t",strtotime($res_y."-".$res_m."-01"));
if($d<$t){
	$res_d = $d;
}else{
	$res_d = $t;
}
return strtotime($res_y."-".$res_m."-".$res_d);
}

PHP实现指定时间的n月之前的这一天的两种算法

时间: 2024-10-10 20:06:34

PHP实现指定时间的n月之前的这一天的两种算法的相关文章

js获取指定时间的前几秒

//指定时间减2秒 function reduceTwoS(dateStr){//dateStr格式为yyyy-mm-dd hh:mm:ss var dt=new Date(dateStr.replace(/-/,"/"));//将传入的日期格式的字符串转换为date对象 兼容ie // var dt=new Date(dateStr);//将传入的日期格式的字符串转换为date对象 非ie var ndt=new Date(dt.getTime()-2000);//将转换之后的时间减

计算指定时间与当前的时间差 比如,3天前、10分钟前

计算指定时间与当前的时间差  比如,3天前.10分钟前(这个在项目中经常遇到,所以记录了下来) 以下是实现方法: /** * 计算指定时间与当前的时间差 * @param compareDate   某一指定时间 * @return 多少(秒or分or天or月or年)+前 (比如,3天前.10分钟前) */ +(NSString *) compareCurrentTime:(NSDate*) compareDate // { NSTimeInterval  timeInterval = [com

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 [sql] view plaincopy <span style="font-family: 'Microsoft YaHei'; font-size: 14px;">MySQL定时任务event</span> 由于一些业务需求,我们可能需要定时清除数据库一些废弃的数据

Sql server 查询指定时间区间工作日数、休息日数等日期操作

1.查询指定时间区间的工作日 这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表.主要字段有年份,类型(是否调休),假期日期.如下: CREATE TABLE [dbo].[Holidays]( [ID] [int] IDENTITY(1,1) NOT NULL, [Holiday] [datetime2](7) NULL,--假期日期 [YearS] [char](4) NULL,--年份 [daytype] [int] NULL--类型 ) 添加好当

在指定时间干,必须干(kbmmw 中的事件调度)

从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能, 例如,权限管理.日志系统.调度系统.内存调试等功能. 今天给大家介绍一下kbmmw 的调度事件,调度事件的主要目标就是”在指定时间干,必须干“,不是“爱干”,是“必须干” :). 在传统的delphi 中事件调度室通过两种方式,一种方式通过Ttimer 来实现,(我20年做的母校的食堂餐饮消费系统就是通过Ttimer来轮询 POS 机的).另外一种就是通过扩展Tthread 线程类,通过后台完

分析VTL以及利用日志备份还原数据库到指定时间

本文原整理于2012-09 一备份链 USEMASTER; GO CREATEDATABASElogtest 运行如下语句 USElogtest go DBCCloginfo 图1-1 运行如下语句可以看到产生很多VTL USElogtest go SELECTTOP 10000 *INTOt1 FROMAdventureWorks.Sales.SalesOrderHeader DBCCloginfo 图1-2 运行如下语句可以看到日志被截断,标记为可重用状态(status=0) USElogt

ONLY三行脚本, SQL数据恢复到指定时间点

经常看到有人误删数据,或者误操作,特别是Update和Delete的时候没有加WHERE ... 然后就喊爹喊娘了,怕是亲爹妈也无奈摇肩. 话说,如果没有犯过错误,那你还算是搞程序的吗?!没了偶尔的心跳,注定一辈子的孤独啊,哈哈哈.... OK,书归正传,要分享一下我的当时的处理方案,与诸君共勉,欢迎吐槽,多多沟通. 遇到这种情况,一般都是没有做备份,或者备份不及时(比如,当时我公司的数据,就没有做实时备份,不过还好的是我25号数据误操作,组长也然在19号做了备份,万幸万幸哦!),不然也不会来发

编程常用英语单词【2016.6月之前熟记要求会默写】

笨人用笨办法,要求熟记,默写,必须做到. 第一部分.计算机算法常用术语中英对照Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multipl

iOS规范化时间格式,object-C计算指定时间与当前的时间差

object-c计算指定时间与当前的时间差 头文件(.h): #import <Foundation/Foundation.h> @interface LuDate : NSDate +(NSString *) compareCurrentTime:(NSString*) strDate; @end .m文件: /** * 计算指定时间与当前的时间差 * @param compareDate 某一指定时间 * @return 多少(秒or分or天or月or年)+前 (比如,3天前.10分钟前)