在使用PHP的过程中,日期系列函数是出镜率非常高的,今天就谈谈日期函数的常用方式,以及PHP日期函数的那些坑。
Date/Time 函数允许您从 PHP 脚本运行的服务器上获取日期和时间。您可以使用 Date/Time 函数通过不同的方式来格式化日期和时间。
注释:这些函数依赖于服务器的本地设置。
PHP日期函数(基础常用部分):
date_default_timezone_set() 设置默认时区,被所有的 Date/Time 函数使用。例:date_default_timezone_set('PRC');PRC是指中华人民共和国(People's Republic of China);这段代码是把默认时区设置成了中国标准时间。
date_format() 返回一个根据指定格式进行格式化的日期。
例:$date = date_create("2019-03-15");
echo date_format($date, "Y/m/d H:i:s");//返回一个根据指定格式进行格式化的日期(输入的是时间对象,不能是字符串)。
date() 格式化本地日期和时间。例:echo date("Y-m-d H:i:s"); 输出:2019-10-30 16:14:24
microtime() 返回当前 Unix 时间戳的微秒数。echo microtime(); 输出0.53204500 1572423353(用法在php程序计算消耗时间处已有详解)
strtotime() 将任何字符串的日期时间描述解析为 Unix 时间戳。echo strtotime("2019-10-01"); 输出字符串日期的unix时间戳1569859200
time() 返回当前时间的 Unix 时间戳。echo time(); 输出当前unix时间戳1572423487
PHP日期函数(拓展部分):
在一系列的时间函数里面,date()函数和strtotime()函数是最常用,且用法也非常丰富的两个函数
date() 函数用法:date(format,timestamp);
返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()。
format:必需参数,规定输出日期字符串的格式。可使用下列字符:
d - 一个月中的第几天(从 01 到 31)
j - 一个月中的第几天,不带前导零(1 到 31)
w - 星期几的数字表示(0 表示 Sunday[星期日],6 表示 Saturday[星期六])
m - 月份的数字表示(从 01 到 12)
n - 月份的数字表示,不带前导零(1 到 12)
Y - 年份的四位数表示(例2019)
y - 年份的两位数表示(例19)
g - 12 小时制,不带前导零(1 到 12)
G - 24 小时制,不带前导零(0 到 23)
h - 12 小时制,带前导零(01 到 12)
H - 24 小时制,带前导零(00 到 23)
i - 分,带前导零(00 到 59)
s - 秒,带前导零(00 到 59)
N - 星期几的 ISO-8601 数字格式表示(1-7,表示 Monday[星期一]-Sunday[星期日])
o - ISO-8601 标准下的年份数字(例2019)
l('L' 的小写形式)- 星期几的完整的文本表示(英文展示)
z - 一年中的第几天(从 0 到 365)
F - 月份的完整的文本表示(January[一月份] 到 December[十二月份])
M - 月份的短文本表示(用三个字母表示,一般是英文月份的前三个字母)
t - 给定月份中包含的天数
L - 是否是闰年(如果是闰年则为 1,否则为 0)
u - 微秒(PHP 5.2.2 中新增的)
e - 时区标识符(例如:UTC、GMT、Atlantic/Azores)
O - 格林威治时间(GMT)的差值,单位是小时(实例:+0100)
P - 格林威治时间(GMT)的差值,单位是 hours:minutes(PHP 5.1.3 中新增的)
U - 自 Unix 纪元(January 1 1970 00:00:00 GMT)以来经过的秒数
如果成功则返回格式化的日期字符串,如果失败则报 E_WARNING 错并返回 FALSE。
strtotime()将任何字符串的日期时间描述解析为Unix时间戳
// 更多实例(PHP_EOL只是换行符而已)
echo strtotime("now"), PHP_EOL;
echo strtotime("2019-10-30"), PHP_EOL;
echo strtotime("2019/10/30"), PHP_EOL;
echo strtotime("20191030"), PHP_EOL;
echo strtotime("10 October 2019"), PHP_EOL;
echo strtotime("10 Oct 2019"), PHP_EOL;
echo strtotime("+1 day"), PHP_EOL;//当前时间+24*3600得到的时间戳
echo strtotime("-1 day"), PHP_EOL;//当前时间-24*3600得到的时间戳
echo strtotime("yesterday"), PHP_EOL;//昨天0点时间戳
echo strtotime("tomorrow"), PHP_EOL;//明天0点时间戳
echo strtotime("last day"), PHP_EOL;//当前时间-24*3600得到的时间戳
echo strtotime("next day"), PHP_EOL;//当前时间+24*3600得到的时间戳
echo strtotime("+1 week"), PHP_EOL;//(当前时间+7*24*3600得到的时间戳)
echo strtotime("last week"), PHP_EOL;//(上周一0点时间戳)
echo strtotime("+1 week 2 days 4 hours 2 seconds"), PHP_EOL;//(当前时间+7*24*3600+2*24*3600+4*3600+2小时时间戳)
echo strtotime("next Monday"), PHP_EOL;//(下周一0点时间戳)
echo strtotime("last Monday"), PHP_EOL;//(上周一0点时间戳)
echo strtotime("+1 Month", strtotime("2019-10-31")), PHP_EOL;//(12月1号0点时间戳)
echo strtotime("+1 Month", strtotime("2019-11-01")), PHP_EOL;//(12月1号0点时间戳)
echo strtotime("-1 Month", strtotime("2019-10-31")), PHP_EOL;//(10月1号0点时间戳)
echo strtotime("-1 Month", strtotime("2019-02-28")), PHP_EOL;//(1月28号0点时间戳)
echo strtotime("-1 Month", strtotime("2019-03-01")), PHP_EOL;//(02月1号0点时间戳)
注意:strtotime()+1,-1month的用法, 是最坑的用法,+1 day是当前时间戳加24*86400,+1 week是当前时间戳加24*86400*7,
但是+1month,-1month,却不是加减30*24*86400,因为随着每个月天数的不同,加减1month的天数也不一样,比如1月31号+1month,是3月3号,而不能得到2月某一天的时间戳,所以,使用加减1month的时候,切记小心使用。
最安全的方式,就是取上个月或者下个月1号0点的时候,先把要转换的时间转换成当月1号,使用这个月的1号再+1month或者-1month,这样一定能取到下个月1号或者上个月1号0点的数据。例如:根据2月任意一天的时间戳,想换取下个月1号时间戳的用法是:echo strtotime("+1 Month", strtotime(date("Y-m-1", time())));