本文主要内容:
1)、strtotime函数的一些用法
2)、strtotime函数的实现基本原理
3)、strtotime(”-1 month”)求值失败的原因
下面介绍下strtotime函数的用法。
1、 strtotime(”JAN”)和strtotime(”January”)
这两个用法的效果是一样的,都是返回指定月份的今天,如果指定月份没有今天,则顺延到下一个月。 如在2011-03-31计算二月,代码:
程序会输出: 2011-03-03 00:00:00。 从表象来看,这个结果也许不一定是我们想要的,但是这也算是一种解决方案,这种方案是由什么决定的呢? strtotime函数在执行月份的计算
时只计算了月份,相当于直接将月份设置为指定的月份的值,而如jan,january都会有一个对应内部数值。
2、 first关键字
first是一个辅助型的关键字,它可以与星期,天等可以指定确认值的关键字组合使用,如求2011年的第一个星期天:
在PHP的源码中,对于first与星期和天的组合使用是分开的,即first day对应一个处理操作, 在最终的C实现中,天的值指定为1,即time结构中的d字段指定为1,如下代码:
case 1: /* first */
time->d = 1;
break;
case 2: /* last */
time->d = 0;
time->m++;
break;
}
3、previous和next关键字
与first类似,previous关键字可以与星期,天组合使用,表示指定时间的前一个星期几或前一天。如下所示代码:
程序会输出:2011-01-30 00:00:00
程序求2011-02-01的前一个星期天。
next关键字与previous相反,它表示下一个星期几或后一天。
4、 last关键字
last关键字既可以作为上一个,也可以作为最后一个。如求上一个星期天的日期:
程序会输出: 2011-01-30 00:00:00
当程序作为最后时,其应用场景是指定日期所在月的最后一天,相当于date(”t”)的结果。如求2000年2月的最后一天:
first、previous、last和this关键字在re文件中属于同一组。
5、 back和front关键字
这两个关键字是对一天中的小时的向前和向后操作,其调用格式如下:
echo date("Y-m-d H:i:s", strtotime("front of 24", strtotime("2011-02-01"))), "<br />";
back表示将时间设置指定小时值的后一个小时的15分的位置。如果是24点,则算到第二天的0点15分。
front表示将时间设置指定小时值的前一个小时的45分的位置。如果是0点,则算前一天的23点45分。
上面的代码输出:2011-02-02 00:15:00 2011-02-01 23:45:00。 其中back of和front of后接的数组必须大于等于0并且小于等于24。
strtotime函数的实现基本原理
官方文档对于strtotime函数的说明是这样的:本函数预期接受一个包含美国英语日期格 式的字符串并尝试将其解析为 Unix 时间戳 (自 January 1 1970 00:00:00 GMT 起的秒数
),其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间。
这是一个标准PHP内置函数,从PHP4起就已经存在。strtotime函数是以一个扩展的方式加载进来的,在ext/date目录下有其全部实现。 作为一个标准的内置函数,其定义格式也是标准
的,如下:
// 处理输入,对于是否有第二个参数有没的处理
// 调用相关函数,实现字符串的解析和结果计算
// 返回结果
}
在输入处理中,先识别两个参数都存在的情况并进行处理,如果不是此种状态,则处理第二个参数不存在的情况, 如果都没有,则报错,返回FALSE。
一开始使用 strtotime(”-1 month”) 函数求值,月长度不一样的月份的计算结果有误。
例,2011-03-31,得到:2011-03-03。
如何解决这个问题呢?
PHP中有一个mktime函数,用这个函数写出的代码如下:
date("s", $time), date("n", $time) - 1, date("j", $time), date("Y", $time)));
当执行时,发现结果和strtotime的结果是一样的。
还是基于这个函数,既然无法直接操作月,那么我们从天入手,得到上一个月,然后再使用date拼接数据。
例如:
$time = strtotime("2011-03-31");
/**
* 计算上一个月的今天
* @param type $time
* @return type
*/
function last_month_today($time) {
$last_month_time = mktime(date("G", $time), date("i", $time),
date("s", $time), date("n", $time), - 1, date("Y", $time));
return date(date("Y-m", $last_month_time) . "-d H:i:s", $time);
}
echo last_month_today($time);
?>
问题再次出现,不存在2011-02-31这样的日期,怎么办?
需求是对于这样的日期显示当月最后一天。
例如:
$time = strtotime("2011-03-31");
/**
* 计算上一个月的今天,如果上个月没有今天,则返回上一个月的最后一天
* @param type $time
* @return type
*/
function last_month_today($time){
$last_month_time = mktime(date("G", $time), date("i", $time),
date("s", $time), date("n", $time), 0, date("Y", $time));
$last_month_t = date("t", $last_month_time);
if ($last_month_t < date("j", $time)) {
return date("Y-m-t H:i:s", $last_month_time);
}
return date(date("Y-m", $last_month_time) . "-d", $time);
}
echo last_month_today($time);
?>
注意: date(”Y-m”, $last_month_time) . “-d”这段代码。在写代码的过程中如果写成了 “Y-” . date(”m”, $last_month_time) . “-d” 则在跨年的时间
上有问题。
除了这种方法,还可以先算出年月日再拼接字符串,这里就是纯粹的字符串操作了。
有关用php计算上个月的今天的代码,就介绍到这里了,有点小波折,希望对大家有所帮助。
PHP 有三大流程控制:顺序控制,分支控制,循环控制。
1、顺序控制:就是程序按顺序从上往下一步一步的执行。
2、分支控制:程序有选择的执行。又分单分支,多分支,多重分支。
a、单分支:基本语法结构:
if(条件表达式){
语句;
//.....;
}
提示:条件表达式不管有多复杂,最终就是true或者false;
例子,
if(a>10){
echo "a>10";
}
b、多分支:基本语法:
if(条件表达式){
语句;
//.....;
}else{
语句;
//.....;
}
c、多重分支:基本语法:
语句;n个语句;
}else if(条件表达式){
语句;n个语句;
}elseif(条件表达式){
语句;n个语句;
}eles{
语句;n个语句;
}
提示:1、else if 可以有一个 也可以有多个。2、最后那个else可以没有
d、switch分支语句
switch(表达式){
case 常量1:
语句;n个语句;
break;
case 常量2:
语句;n个语句;
break;
case 常量3:
语句;n个语句;
break;
default:
语句;n个语句;
break;
}
注意:
1、case 语句有一到多
2、defaul 语句可以没有(根据自己代码的业务逻辑)
3、通常,在case 语句后,要带break ,表示退出switch语句
4、常量的类型 (int, float, 字符串, 布尔型)
重点:程序首先按照case顺序进行配置,如果一个都没有匹配到,则执行 default语句的内容,直到遇到break,则退出switch;
if 和 switch 分支比较:
if 对某个范围的判断,而switch是对一个点的判断, 所以我们可以这样去选择他们:
应用场景: 当分支就是几个点时(比如判断坦克的方向),使用swtich。
当分支是几个区域(范围)的判断,则考虑使用if。