PHP日期时间处理
概述
PHP中对日期进行处理常用的几个函数如下:
- date(): 把时间戳格式化为更易读的日期和时间
- time(): 获取当前 Unix 时间戳
- strtotime(): 将表示时间和日期的字符串转化为相应的时间戳
- mktime(): 创建日期
这些函数是PHP核心的部分,无需安装即可使用。另外需要注意的是,这些函数的行为还受到 php.ini 中配置的时区等的影响。
名称 | 描述 | 默认 | PHP 版本 |
---|---|---|---|
date.timezone | 默认时区(所有的 Date/Time 函数使用该选项) | "" | PHP 5.1 |
date.default_latitude | 默认纬度(date_sunrise() 和 date_sunset() 使用该选项) | "31.7667" | PHP 5.0 |
date.default_longitude | 默认经度(date_sunrise() 和 date_sunset() 使用该选项) | "35.2333" | PHP 5.0 |
date.sunrise_zenith | 默认日出天顶(date_sunrise() 和 date_sunset() 使用该选项) | "90.83" | PHP 5.0 |
date.sunset_zenith | 默认日落天顶(date_sunrise() 和 date_sunset() 使用该选项) | "90.83" | PHP 5.0 |
date() 函数详细介绍
data() 函数的语法如下:
string date ( string $format [, int $timestamp ] )
- format : 必需,规定输出日期字符串的格式
- timestamp : 可选,规定整数的 Unix 时间戳。默认是当前的本地时间 time()
- 返回值是格式化后的时间字符串
<?php
// 假定今天是:March 10th, 2001, 5:16:18 pm
$today = date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (MySQL DATETIME 格式)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month
$today = date("H:i:s"); // 17:16:17
date('Y'); // 当前年份
date('m'); // 当前月份
date('d'); // 当前是几号
strtotime() 函数详细介绍
strtotime() 函数语法如下:
int strtotime ( string $time [, int $now = time() ] )
- time : 日期/时间字符串
- now : 用来计算返回值的时间戳
- 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳,其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间
- 成功则返回时间戳,否则返回 FALSE,在 PHP 5.1.0 之前本函数在失败时返回 -1
<?php
echo strtotime("now"), "\n"; // 现在时间戳
echo strtotime("10 September 2000"), "\n"; // 2000年10月现在时间戳
echo strtotime("+1 day"), "\n"; // 距离现在一天后的时间戳
echo strtotime("-3 day"), "\n"; // 距离现在三天前的时间戳
echo strtotime("+1 week"), "\n"; // 距离现在一周后的时间戳
echo strtotime("-1 month"), "\n";// 距离现在一个月前的时间戳
echo strtotime("+1 year"), "\n"; // 距离现在一年后的时间戳
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; // 距离现在1周2天4小时2秒后的时间戳
echo strtotime("next Thursday"), "\n"; // 下个星期三
echo strtotime("last Monday"), "\n"; // 本月的最后一个星期一
mktime() 函数详细介绍
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 ]]]]]]] )
- 参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值
- hour : 小时数
- minute : 分钟数
- second : 秒数(一分钟之内)
- month : 月份数
- day : 天数
- year : 年份数
- is_dst : 本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制
- 任何给定月份的最后一天都可以被表示为下个月的第 "0" 天,而不是 -1 天
- 如果参数非法,本函数返回 FALSE (在 PHP 5.1 之前返回 -1)
<?php
$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);
?>
其他一些常用函数
time() 获取当前Unix秒数时间戳,还可以使用 microtime() 获取当前 Unix 时间戳和微秒数,这个函数经常用来计算脚本运行的耗时
mixed microtime ([ bool $get_as_float ] )
- 如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
- 如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数
- get_as_float 参数是 PHP 5.0.0 新加的
<?php
/**
* 兼容php5.0版本以下
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
usleep(100); // 睡一小会儿
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "耗时: $time 秒\n";
?>
时间戳和时间字符串
基本函数使用说明
使用 time() 函数,会获取当前时间的 Unix 时间戳,是一个10位的整数,表示自 Unix 纪元(1月1日 1970 00:00:00 GMT)起的当前时间的秒数。
使用 strtotime() 函数,可以将任何英文文本的日期或时间描述解析为 Unix 时间戳。失败则返回 FALSE。应该尽可能使用 YYYY-MM-DD 格式或者使用 date_create_from_format() 函数
使用 date() 函数,可以将时间戳按照指定的格式格式化为时间字符串
基本示例
$time = time(); // 当前时间戳
var_dump($time); // int(1516155874)
$time_str = date('Y-m-d H:i:s', $time); // 将时间戳转化为相应的时间字符串
var_dump($time_str); // string(19) "2018-01-17 02:24:34"
$time_int = strtotime($time_str); // 将时间字符串转化为时间戳
var_dump($time_int); // int(1516155874)
常用时间获取
获取那种基于某个时间一定时间段的时间的做法,可以使用 strtotime(),也可以 time() 获取当前时间然后加上或减去指定时间距离现在的偏移秒数。
- 获取前一天的时间戳:strtotime('-1 day') 或者 time() - 3600 * 24
- 获取今天凌晨0点的时间戳:strtotime(date("Y-m-d"), time())
- 获取今天某个时刻如6点半的时间戳: strtotime(data('Y-m-d')) + 6 * 3600 + 30 * 60
数据库查询注意事项
在数据库中保存为 timastamp 或者 datetime 类型的数据,在PHP中查询时,需要使用时间字符串进行查询,而且查询结果也是时间字符串。
另外如果是使用 int 类型保存的时间戳,则要使用时间戳进行查询。查询结果是时间戳。