PHP关于时间的函数可以参考这里,可以看到PHP已经提供了很多函数以供我们使用,熟练掌握这些函数可以让你摆脱冗长复杂的计算,希望本文能够让你事半功倍!
ps.关于时间戳与日期的转换工具,博主推荐这个时间戳转换工具。
[TOC]
PHP时区设置
在使用PHP与时间有关的时间函数时,一定要先定义时区,否则每次使用时间函数的时候会显示一个Notice级别的错误。
本文中所有的示例都基于中国时间,即GTM 8
固化在文件
再php.ini配置文件里找到被注释掉的
;data.timezone =
改为:
date.timezone = PRC
其中PRC可以换为
代码语言:javascript复制Asia/Shanghai – 上海
Asia/Chongqing – 重庆
Asia/Urumqi – 乌鲁木齐
Asia/Hong_Kong – 香港
Asia/Macao – 澳门
Asia/Taipei – 台北
Asia/Singapore – 新加坡
运行时定义时区
方法一
代码语言:javascript复制ini_set('date.timezone','Asia/Shanghai');
方法二
代码语言:javascript复制date_default_timezone_set('PRC');
//此函数PHP4不存在,考虑到兼容性可以先使用下面的方法用来判断函数是否可用
function_exists(date_default_timezone_set)
时间戳
什么是时间戳(timestamp)?他指的是格林威治时间 1970 年 1 月 1 日 00:00:00到当前时间的秒数,也称Unix时间戳(Unix timestamp)或时间戳。
time
time()
函数应该是最简单的时间函数了,该函数不接受参数,返回的是当前时间的时间戳。
echo time();
//1410174652
microtime
这个函数与time()
类似,他返回当前时间戳以及微秒数,用空格隔开。
echo microtime();
//0.55958200 1410174780
为了计算时间,一般会把该函数封装。
代码语言:javascript复制function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec (float)$sec);
}
mktime
根据参数生成对应的时间戳
代码语言:javascript复制int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
例子:
代码语言:javascript复制echo mktime(0, 0, 0, 3, 27, 1990);
//638467200
//1990-3-27 00:00:00
下面几种情况值得注意:
小时,分钟和秒
以小时为例,小时的范围应该是0-23,但是如果超过这个范围,会发生什么?请读者结合示例代码自己总结。
代码语言:javascript复制echo mktime(28, 0, 0, 3, 27, 1990);
//638568000
//1990-3-28 04:00:00
echo mktime(-28, 0, 0, 3, 27, 1990);
//638366400
//1990-3-25 20:00:00
月,日和年
以日为例,其范围应该是1-31,有几个特殊情况需要注意。请看下面示例。
代码语言:javascript复制echo mktime(0, 0, 0, 3, 1, 1990);
//1990-3-01 00:00:00
echo mktime(0, 0, 0, 3, 0, 1990);
//636134400
//1990-2-28 00:00:00
//1变为0,日期提前了一天。
//利用这个特性,我们可以轻易的得出当月的最后一天的日期
echo mktime(0, 0, 0, 4, 0, 1990);
//638812800
//1990-3-31 00:00:00
//也能轻易得出给定月份的天数
echo date( "t", mktime( 0, 0, 0, 2, 1, 2000 ) );
//29
格式化
date
这个函数的作用是把时间戳格式化为指定格式,接受两个参数,第一个为格式,具体写法请参考官方说明,第二个为时间戳,默认为当前时间,即time()
。
下面的例子可以得到明天,上个月和下一年。
代码语言:javascript复制$tomorrow = mktime(0, 0, 0, date("m") , date("d") 1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y") 1);
strtotime
将任何英文文本的日期时间描述解析为Unix时间戳,这是一个很强大的函数!
代码语言:javascript复制int strtotime ( string $time [, int $now = time() ] )
参数1:日期/时间字符串。 参数2:用来计算返回值的时间戳。
注意年月日的顺序
代码语言:javascript复制echo date('Y-m-d', strtotime("06/08/2014")), "n";
//2014-06-08
echo date('Y-m-d', strtotime("06-08-2014")), "n";
//2014-08-06
strtotime
可以'理解'一些自然语句,十分好用!
echo strtotime("2014-03-27"), "n";
echo strtotime("December 31"), "n";
echo strtotime("now"), "n";
echo strtotime("10 September 2000"), "n";
echo strtotime(" 1 day"), "n";
echo strtotime(" 1 week"), "n";
echo strtotime("Saturday"), "n";
echo strtotime(" 1 week 2 days 4 hours 2 seconds"), "n";
echo strtotime("next Thursday"), "n";
echo strtotime("last Monday"), "n";
还可以指定日期
代码语言:javascript复制$time = date('Y-m-d H:i:s', time());
echo strtotime($time.'1day'), "n";
echo "n";
echo strtotime($time.'-1year'), "n";
//也可以直接使用时间戳
echo strtotime('-1year', time());, "n";
strtotime(" 1 week", $startdate);
星期数相关
代码语言:javascript复制//获取指定星期数的第一天,参数格式yyyyWww
//最后两个ww指你需要的周数
echo date('Y-m-d H:i:s',strtotime('2014W01')), "n";
//2014年第一周的第一天
//2013-12-30 00:00:00
//获取指定星期数的第N天,参数格式yyyyWww-N。N的取值范围是1-7
echo date('Y-m-d H:i:s',strtotime('2014W01-5')), "n";
//2014年第一周的第五天
//2014-01-03 00:00:00
DateTime类
这里是DateTime类文档链接
DateTime类实现了DateTimeInterface接口,它实现了很多关于时间的功能,如时间的比较、修改、创建和格式化等。 创建一个DateTime对象很简单:
代码语言:javascript复制$datetime = new DateTime; //面向对象
$datetime_specific = new DateTime('2014-03-27'); //面向对象
其主要方法包括:
代码语言:javascript复制$datetime->add(); //增加时间
$datetime->sub(); //减少时间
$datetime->modify(); //修改时间
$datetime->format(); //格式化输出
$datetime->setTime(); //设置时间
$datetime->diff(); //对比时间,返回时间差
以上方法在此不展开讲了,有兴趣TX请自己上面的文档学习。
DateInterval类
DateInterval类表示一个时间段,这个类在DateTime的add()
、sub()
还有diff()
中会用到,其构造函数里需要传入时间增量
什么是时间增量?
他用来描述一段时间,形如P1Y2M3DT4H5M6S,字母都是大写。其中P后面跟年月日,T后面是时分秒。例:
代码语言:javascript复制P1YT1S 1年零一秒
T1H1S 1小时零一秒
理解了时间增量,那么我们来构造一个DateInterval对象吧:
代码语言:javascript复制$eightynine_days_ago = new DateInterval( "P89D" );
接下来就可以把他们用在DateTime的add()
、sub()
还有diff()
中了。
localtime
代码语言:javascript复制array localtime ([ int $timestamp = time() [, bool $is_associative = false ]] )
localtime
以时间戳为准,返回一个数组,其结构和 C 函数调用返回的完全一样。
例:
代码语言:javascript复制print_r( localtime(strtotime('2014-03-27 12:13:14')) );
Array
(
[0] => 14
[1] => 13
[2] => 12
[3] => 27
[4] => 2
[5] => 114
[6] => 4
[7] => 85
[8] => 0
)
如果第二参数为真,则返回一个关联数组,与之前的索引数组对应。
代码语言:javascript复制print_r( localtime(strtotime('2014-03-27 12:13:14'), true) );
Array
(
[tm_sec] => 14
[tm_min] => 13
[tm_hour] => 12
[tm_mday] => 27
[tm_mon] => 2
[tm_year] => 114
[tm_wday] => 4
[tm_yday] => 85
[tm_isdst] => 0
)
说明:
代码语言:javascript复制"tm_sec" - 秒数, 0 到 59
"tm_min" - 分钟数, 0 到 59
"tm_hour" - 小时, 0 到 23
"tm_mday" - 月份中的第几日, 1 到 31
"tm_mon" - 年份中的第几个月, 0 (Jan) 到 11 (Dec)
"tm_year" - 年份,从 1900 开始
"tm_wday" - 星期中的第几天, 0 (Sun) 到 6 (Sat)
"tm_yday" - 一年中的第几天, 0 到 365
"tm_isdst" - 夏令时当前是否生效? 如果是生效的是正数, 0 代表未生效,负数代表未知。
日历Calender函数
文档在这儿
老高觉得这Calender函数中最有用的就是这个cal_days_in_month
了,他返回某个历法中某年中某月的天数。
例:
代码语言:javascript复制echo cal_days_in_month(CAL_GREGORIAN, 2, 2014);
//28
比之前mktime()
要简单的多吧。
总结
关于时间的函数就介绍到这儿,由于老高时间有限,许多有趣的函数,如checkdate
、date_diff
都没有铺开介绍,争取日后补上。
纵观PHP在5.0版本的时间函数,不难发现,PHP为我们提供了一套很简单快捷的函数帮助我们处理时间,而且很多计算的方法不止一种,希望大家掌握本文提供的最基础的函数,然后运用到实际的开发中去。