PHP日期与时间

日期与时间是一种比较复杂的组合型数据,各种环境下的处理方式并不完全一致;本节,我们就了解一些在PHP中处理日期与时间的函数,并对一些常用代码进行封装。

time()、mktime()与checkdate()函数

在PHP中处理日期和时间,有一个很重要的概念就是UNIX时间戳(timestamp),这是一个整数,这个数据的基点就是1970年1月1日零时零分零秒的时刻,其值为0,而时间戳数据实际上就是距离这一基准时间的秒数。

我们可以使用time()函数获取系统中的当前时间戳,如下面的代码。

echo time();

除了使用time()函数获取当前时间,我们还可以使用mktime()函数创建一个时刻的时间戳,此函数的定义如下:

int mktime(<时>, <分>, <秒>, <月>, <日>, <年>, <是否夏令时>)

这几个参数都整数类型,并且都是可选的,如果这些参数都不指定,那么,mktime()函数返回的值与time()函数的作用就是相同的。

使用mktime()函数时应注意,如果环境中设置的时区不确定,会在页面中显示一个警告信息;在实际应用中,我们可以使用date_default_timezone_set()函数设置默认的时区;在大陆地区,可以设置的时区参数有”Asia/Shanghai”和”Asia/Chongqing”,即上海和重庆。下面的代码,将分别显示当前时间戳和一个指定时刻的时间戳。

date_default_timezone_set('Asia/Shanghai');  
echo mktime();  
echo '<br>';  
echo mktime(8,15,56,6,26,2011);

此外,如果只需要年、月、日,可以将mktime()函数的前三个参数设置为0,而年、月、日数据是否能够正确组成时间戳数据,还可以使用checkdate()函数进行验证,它的三个参数都是整数,定义格式如下:

bool checkdate(<月>, <日>, <年>)

如下面的代码。

date_default_timezone_set('Asia/Shanghai');  
var_dump(checkdate(2,30,2015));  // 显示bool(false),2月没有30号

date()函数

如果我们只能使用整数来处理日期和时间的值,当然不太直观,此时,我们可以使用date()函数将日期和时间信息转换为特定内容和格式的字符串,如下面的代码,将显示系统当前时间的标准日期时间字符串。

date_default_timezone_set('Asia/Shanghai');  
print date('c');

这种格式包含了完整的日期与时间信息,并包含了“T”字母和时区信息,也许你还是觉得有些太复杂了,因为在实际应用中,我们可能只需要如下格式的日期和时间信息:

年-月-日 时:分:秒

此时,我们可以使用一些格式化字符来完成这项工具,如下面的代码。

date_default_timezone_set('Asia/Shanghai');  
print date('Y-m-d H:i:s');

代码中的date()函数将显示当前系统中的日期和时间,如果我们需要给出指定时刻的信息,可以在date()函数的第二个参数中设置相应的时间戳。请注意代码中的格式化字符,它们是严格区分大小写的,本例中,将始终返回19个字符的字符串,包括4位年份,月、日、时、分、秒都为2位,另外还有2个连接符、2个冒号和一个空格。

在date()函数的第一个参数中,我们还可以使用很多的格式化字符,其中还有一些比较实用的,如大写字母L,它会返回是否为闰年的信息,我们可以使用如下的代码。

date_default_timezone_set('Asia/Shanghai');  
isLeapYear = (bool)date('L');  
if (isLeapYear)  
    echo '今年是闰年';  
else  
    echo '今年不是闰年';

使用大写字母Z作为格式化字符时,会返回当前时区与格林尼治(Greenwich)标准时间相差的秒数,如下面的代码。

date_default_timezone_set('Asia/Shanghai');  
echo date('Z'); // 显示28800,正八区,8*60*60

在date()函数中,还有一个比较实用的格式化字符是大写字母W,它可以给出当前日期是当年的第几周,如:

date_default_timezone_set('Asia/Shanghai');  
echo date('W');

此外,小写的w返回的是星期几,0是星期日,1到6分别是星期一到星期六。

完成的格式化字符列表可以参考php.net网站,搜索date即可。

getdate()函数

getdate()函数可以一次性给出时间戳中的所有主要日期与时间信息,并以数组的形式返回,数组成员(日期或时间数据项)的索引(键名称)如下:

  • 索引值为0的成员,保存时间戳数据。
  • year,年份数据。
  • mon,月份的数值数据。
  • mday,当月中的第几天。
  • hours,小时数据。
  • minutes,分钟数据。
  • seconds,秒钟数据。
  • wday,一周中的第几天,0为周日,1到6分别是周一到周六。
  • yday,一年中的第几天。
  • month,月份的名称。
  • weekday,星期的名称。

我们根据相应的索引或键可以很方便的获取相应的日期和时间数据,如果你想根据这些数据快速地创建变量,可以使用extract()函数,如下面的代码。

date_default_timezone_set('Asia/Shanghai');  
extract(getdate(), EXTR_PREFIX_ALL,'dt');  
echo $dt_0;

代码会显示当前时间的时间戳。请注意extract()函数的使用,我们对每一个数据成员名称都添加了dt前缀,如果不这样做,索引0的数据项不能正确创建变量,因为变量名不能以数字开始;通过添加前缀,我们可以将所有的数组成员转化为对应的变量,如dt_year变量保存年份数据、dt_0变量保存时间戳等。

microtime()函数

我们知道,使用time()函数返回的时间戳只精确到秒,如果我们需要更小的时间单位数据,如微秒,则可以使用microtime()函数。此函数有一个可选参数,其使用规则如下:

microtime()或microtime(false)

这两种使用方法产生的结果是相同的。函数会返回一个字符串,包括两个使用空格分隔的部分,前一部分为微秒信息(小数形式),后一部分为秒数(整数形式),我们可以使用如下代码将它们分离后分别使用。

date_default_timezone_set('Asia/Shanghai');  
mtstr = microtime();arr = explode(' ',mtstr);microsecond = (double)arr[0];second = (int)arr[1];  
echosecond,$microsecond;

这种调用方式返回的小数精度很高,我们可以根据需要对其进行加工使用。

microtime(true)

这种调用形式将直接返回一个浮点数,包括秒钟数据(整数部分)和微秒数据(小数部分),如下面的代码。

date_default_timezone_set('Asia/Shanghai');  
echo microtime(true);

这种调用方式只保留四位小数,一般情况下,这也够用了。

封装日期时间处理代码

前面,我们了解了一些常用的日期和时间处理的函数,我们可以看到,在实际开发中的使用并不是十分方便,特别是在只对中国的日期和时间处理,所以,我们会考虑对这些功能进行一定的封装,在处理日期时间数据的时候使用更加便利。

在PHP中的代码封装,常用的方法包括自定义函数和类,而对于简单的功能,定义一些函数就已经足够了,下面就是一些简单的功能封装,这些代码们于/lib/cn.php文件中,大家可以根据需求添加新的函数。稍后讨论如何在PHP文件中引用这些函数。

cnSetTimezone()函数

cnSetTimezone()函数用于设置中国的时区。其定义如下:

// 设置时区  
function cnSetTimezone()  
{  
    date_default_timezone_set('Asia/Shanghai');  
}

cnGetLongDateString()函数

cnGetLongDateString()给出指定时间戳的日期长格式字符串。其定义如下:

// 给出中国日期长格式字符串  
function cnGetLongDateString(ts=null)  
{     cnSetTimezone();     if (!is_int(ts)) ts = time();     return date('Y年m月d日',ts);  
}

其中,参数为可选,如果不使用参数,则返回系统当前日期的长格式字符串。

cnGetShortDateString()函数

cnGetShortDateString()函数给出指定时间戳的日期短格式字符串。其定义如下。

// 给出中国日期短格式字符串  
function cnGetShortDateString(ts=null)  
{     cnSetTimezone();     if (!is_int(ts)) ts = time();     return date('Y-m-d',ts);  
}

参数与cnGetLongDateString()函数一样为可选参数,如果不使用参数,则返回系统当前日期的短格式字符串。

isLeapYear()函数

isLeapYear()函数用于判断指定的时间戳是否为闰年。其定义如下:

// 判断是否为闰年  
function isLeapYear(ts=null)  
{     cnSetTimezone();     if (!is_int(ts)) ts = time();     return (bool)date('L',ts);  
}

getDateTimeString()函数

getDateTimeString()函数将会给出指定时间戳的“年-月-日 时:分:秒”格式字符串。其定义如下:

// 给出标准的日期时间串  
function getDateTimeString(ts=NULL)  
{     cnSetTimezone();     if (!is_int(ts)) ts = time();     return date('Y-m-d H:i:s',ts);  
}

cnGetWeekName()函数

cnGetWeekName()函数给出指定时间戳中的中文星期名称,如星期日、星期一等。其定义如下:

// 给出中文星期名称  
function cnGetWeekName(ts=null)  
{     cnSetTimezone();     if (!is_int(ts)) ts = time();week = intval(date('w', ts));     return array("星期日","星期一","星期二",         "星期三","星期四","星期五","星期六")[week];  
}

如果查看源文件,还可以看到一个CCn.php文件,这是以上封装函数的面向对象版本,在后面的讨论中,我们可以了解如何使用它们。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程