PHP关于时间的函数可以参考这里,可以看到PHP已经提供了很多函数以供我们使用,熟练掌握这些函数可以让你摆脱冗长复杂的计算,希望本文能够让你事半功倍!

ps.关于时间戳与日期的转换工具,博主推荐这个时间戳转换工具

[TOC]

PHP时区设置

在使用PHP与时间有关的时间函数时,一定要先定义时区,否则每次使用时间函数的时候会显示一个Notice级别的错误。

本文中所有的示例都基于中国时间,即GTM+8

固化在文件

再php.ini配置文件里找到被注释掉的

;data.timezone =

改为:

date.timezone = PRC

其中PRC可以换为

Asia/Shanghai – 上海
Asia/Chongqing – 重庆
Asia/Urumqi – 乌鲁木齐
Asia/Hong_Kong – 香港
Asia/Macao – 澳门
Asia/Taipei – 台北
Asia/Singapore – 新加坡

运行时定义时区

方法一

ini_set('date.timezone','Asia/Shanghai');

方法二

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

为了计算时间,一般会把该函数封装。

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

mktime

根据参数生成对应的时间戳

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 ]]]]]]] )

例子:

echo mktime(0, 0, 0, 3, 27, 1990);
//638467200
//1990-3-27 00:00:00

下面几种情况值得注意:

小时,分钟和秒

以小时为例,小时的范围应该是0-23,但是如果超过这个范围,会发生什么?请读者结合示例代码自己总结。

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,有几个特殊情况需要注意。请看下面示例。

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()

下面的例子可以得到明天,上个月和下一年。

$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时间戳,这是一个很强大的函数!

int strtotime ( string $time [, int $now = time() ] )

参数1:日期/时间字符串。 参数2:用来计算返回值的时间戳。

注意年月日的顺序

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";

还可以指定日期

$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);

星期数相关

//获取指定星期数的第一天,参数格式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对象很简单:

$datetime = new DateTime;  //面向对象
$datetime_specific = new DateTime('2014-03-27'); //面向对象

其主要方法包括:

$datetime->add();            //增加时间
$datetime->sub();            //减少时间
$datetime->modify();         //修改时间
$datetime->format();         //格式化输出
$datetime->setTime();        //设置时间
$datetime->diff();          //对比时间,返回时间差

以上方法在此不展开讲了,有兴趣TX请自己上面的文档学习。

DateInterval类

DateInterval类表示一个时间段,这个类在DateTime的add()sub()还有diff()中会用到,其构造函数里需要传入时间增量

什么是时间增量?

他用来描述一段时间,形如P1Y2M3DT4H5M6S,字母都是大写。其中P后面跟年月日,T后面是时分秒。例:

P1YT1S      1年零一秒
T1H1S       1小时零一秒

理解了时间增量,那么我们来构造一个DateInterval对象吧:

$eightynine_days_ago = new DateInterval( "P89D" ); 

接下来就可以把他们用在DateTime的add()sub()还有diff()中了。

localtime

array localtime ([ int $timestamp = time() [, bool $is_associative = false ]] )

localtime以时间戳为准,返回一个数组,其结构和 C 函数调用返回的完全一样。

例:

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
)

如果第二参数为真,则返回一个关联数组,与之前的索引数组对应。

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
)

说明:

"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了,他返回某个历法中某年中某月的天数。

例:

echo cal_days_in_month(CAL_GREGORIAN, 2, 2014);
//28

比之前mktime()要简单的多吧。

总结

关于时间的函数就介绍到这儿,由于老高时间有限,许多有趣的函数,如checkdatedate_diff都没有铺开介绍,争取日后补上。

纵观PHP在5.0版本的时间函数,不难发现,PHP为我们提供了一套很简单快捷的函数帮助我们处理时间,而且很多计算的方法不止一种,希望大家掌握本文提供的最基础的函数,然后运用到实际的开发中去。