PHP获取时间方法总结:date()、time()和strtotime()的详细使用指南
工作中时常会有获取各种时间的需求,现在特地进行总结。首先要明确的是,在 php 中获取时间的方法是 date()。同时,在 php 中获取时间戳的方法有 time()以及 strtotime()。接下来分别进行说明。date()的格式为:date($format, $timestamp),其中 format 表示格式,timestamp 表示时间戳(可选)。time()会返回当前时间的 Unix 时间戳,且无需参数。strtotime($time, $now)能够将任何英文文本的日期时间描述解析为 Unix 时间戳。$time 是必填的,它规定了要解析的时间字符串;$now 用于计算返回值的时间戳,如果省略该参数,就会使用当前时间。

date()函数字符串格式中各个字母的含义:
a - "am" 或是 "pm"
A - "AM" 或是 "PM"
几日,用二位数字表示,若数字不足二位就在前面补零,例如:“01”到“31”。
D - 星期几,三个英文字母; 如: "Fri"
F - 月份,英文全名; 如: "January"
h - 12 小时制的小时; 如: "01" 至 "12"
H - 24 小时制的小时; 如: "00" 至 "23"
g - 对于 12 小时制的小时,如果位数不足两位则不进行补零操作,例如:“1”到“12”。
G - 24 小时制的小时,若不足二位则不补零;例如:“0”到“23”。
i - 分钟; 如: "00" 至 "59"
几日,对于二位数字而言,若其不足二位则不补零,例如:“1”到“31”
l - 星期几,英文全名; 如: "Friday"
m 代表月份,用两位数字表示,当数字不足两位时,在前面补零,例如:从“01”到“12”
n 月份,是二位数字,当数字不足二位时不补零,例如:“1”到“12”。
M - 月份,三个英文字母; 如: "Jan"
s - 秒; 如: "00" 至 "59"
以“s”结尾并加上英文序数,由两个英文字母组成;例如:“th”,“nd”
t - 指定月份的天数; 如: "28" 至 "31"
U - 总秒数
w 表示数字型的星期几,其中“0”代表星期日,“6”代表星期六。
Y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"
strtotime($time)用法举例:
echo 对 '2012-03-22' 进行 strtotime 操作;输出结果为 1332427715(此结果仅为示例说明)
使用 date('Y-d-m') 后,echo strtotime 进行输出。结果与结合 date() 时相同,即实现了时间日期转换为时间戳的功能。
strtotime()具有一个很强大的用法,其参数能够加入对数字的操作以及年、月、日、周等英文字符。示例如下:
echo 日期函数 date('Y-m-d H:i:s',时间戳函数 strtotime('+1 day'));输出结果为 2012-03-23 23:30:33(可发现输出的是明天此时的时间)
echo 输出的是 date('Y-m-d H:i:s',strtotime('-1 day'))的结果;这个结果为 2012-03-21 23:30:33;它表示的是昨天此时的时间。
echo 日期函数 date 的参数为 'Y-m-d H:i:s',传入的时间为 strtotime 函数处理后的 ' +1 week' 的结果;输出结果为 2012 - 03 - 29 23 : 30 : 33,这是下个星期此时的时间。
echo 输出的是 date('Y-m-d H:i:s',strtotime('next Thursday')) 的结果;这个结果为 2012-03-29 00:00:00;它表示的是下个星期四此时的时间。
echo 输出的是 date('Y-m-d H:i:s', strtotime('last Thursday')) 的结果;这个结果为 2012 - 03 - 15 00 : 00 : 00;也就是上个星期四此时的时间。
一些常用的格式化时间:
输出明天凌晨的时间戳,通过先将当前日期加上一天,再将其转换为指定格式的字符串,最后使用 strtotime 函数获取时间戳。具体为:echo "明天凌晨的时间戳:".strtotime(date('Y-m-d',strtotime('+1 day')));
输出一周后的日期,通过 date 函数和 strtotime 函数来实现,date 函数的第一个参数为日期格式 "Y-m-d",第二个参数为当前时间加上一周后的时间,即 strtotime("+1 week"),最终输出的结果为一周后的日期。
两秒后:date("Y-m-d G:H:s",strtotime("+2 seconds"));
输出“下个星期四:”。将当前时间加上一周后再转换为指定格式的日期,即 strtotime("next Thursday") 获取下周四的时间戳,然后使用 date("Y-m-d", 时间戳) 将其格式化为“年-月-日”的形式并输出。
输出:上个周一的日期为。然后通过 date 函数,以“Y-m-d”的格式,使用 strtotime 函数获取上周一的时间戳并进行格式化输出。
输出“一个月前”以及一个月前的日期,该日期通过 date 函数结合 strtotime 函数获取,具体为 date("Y-m-d",strtotime("last month"))。
输出一个月后的日期,具体为通过 strtotime 函数将当前时间加上一个月后得到的时间戳,再使用 date 函数将该时间戳格式化为 "Y-m-d" 的日期格式并输出,即输出一个月后的日期。
输出十年后的日期:通过 date 函数,以 "Y-m-d" 的格式输出在当前时间基础上加上 10 年之后的日期;使用 strtotime 函数将 " +10 year" 转换为时间戳,然后传递给 date 函数进行日期格式化输出。
今天开始时间,通过 date("Y-m-d H:i:s",mktime(0,0,0,date('m'),date('d'),date('Y'))) 来获取。
今天的结束时间为:将当前月的日期加 1 后,再将年、月、日组成新的时间戳,通过 mktime 函数转换为时间,然后将小时、分钟、秒都设置为 0,得到新的时间,最后再减去 1 秒,即为今天的结束时间,即 date("Y-m-d H:i:s",mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1)。
昨天开始时间,是通过以下方式计算得出的:先获取当前日期的月份(m)和日期(d)以及年份(Y),然后使用 mktime 函数,将时间设置为 0 时 0 分 0 秒,日期设置为当前日期的前一天(即 date('m') 对应的月份,date('d') - 1 对应的日期,date('Y') 对应的年份),最后使用 date 函数将计算出的时间格式化为 "Y-m-d H:i:s" 的形式,得到昨天开始的时间 $beginYesterday 。
昨天结束时间,通过以下方式计算得出:$endYesterday = date("Y-m-d H:i:s", mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1);
本周开始时间,通过 date("Y-m-d H:i:s",mktime(0, 0, 0,date("m"),date("d")-date("w")+1,date("Y"))) 来确定。
本周结束时间,通过 date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"))) 来确定。
上周开始时间为:date("Y-m-d H:i:s",mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y')));
上周结束时间,通过 date("Y-m-d H:i:s",mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'))) 计算得出。
本月开始时间,是通过 date("Y-m-d H:i:s",mktime(0,0,0,date('m'),1,date('Y'))) 计算得出的。
本月结束时间为通过以下方式得到:先使用 date("m") 获取当前月份,再使用 date("t") 获取当前月份的天数,然后使用 mktime(23, 59, 59, date("m"), date("t"), date("Y")) 计算出该月的结束时间,最后使用 date("Y-m-d H:i:s", 上述计算结果) 得到具体的结束时间,即 $endThismonth 。
上月开始时间是通过以下方式得到的:先获取当前月份减 1 的月份值,再加上 1 日,以及当前年份,最后使用 mktime 函数将时间设置为 0 时 0 分 0 秒,再使用 date 函数将其格式化为 "Y-m-d H:i:s" 的时间字符串,即得到上月开始时间 $beginLastmonth 。
上月结束时间为:date("Y-m-d H:i:s",mktime(23,59,59,date("m"),0,date("Y"))); 即通过 date 函数和 mktime 函数计算得出的特定时间,该时间表示上月的结束时刻。
本季度开始时间,通过计算得出:$season = ceil((date('n'))/3);
获取当前季度的起始时间,通过将当前年份与季度数乘以 3 再减去 3 后加上 1 作为月份,1 作为日期,0 作为小时、分钟和秒,使用 mktime 函数进行计算,得到的时间即为当前季度的起始时间,具体代码为 date('Y-m-d H:i:s', mktime(0, 0, 0,$season*3-3+1,1,date('Y')))。
本季度结束时间为通过特定函数 date 计算得出的结果,该函数的参数为 'Y-m-d H:i:s' 以及 mktime 函数返回的时间戳,mktime 函数的参数依次为 23、59、59、当前季度数乘以 3、通过 mktime 函数计算出的本月天数(mktime 函数的参数依次为 0、0、0、当前季度数乘以 3、1、当前年份)、当前年份。
上季度开始时间的计算方式为:先获取当前月份(date('n')),将其除以 3 后向上取整(ceil((date('n'))/3)),再减去 1,得到的结果即为上季度开始时间。
上季度开始的时间为 date('Y-m-d H:i:s', mktime(0, 0, 0,$season1*3-3+1,1,date('Y')))
上季度结束时间为:将月份乘以 3 后,通过 mktime 函数设置小时为 23、分钟为 59、秒为 59,再结合 date 函数获取该月的天数,以及当前年份,最终生成的时间为 Y-m-d H:i:s 格式。
本年开始时间为 date("Y",time())."-1"."-1"。
本年结束时间为:通过 date("Y",time())."-12"."-31" 计算得出的时间。