时间日期函数
date_default_timezone_get():得到系统默认时区
date_default_timezone_set($str):设置系统默认时区,中国设置:"PRC"、"Asia/Shanghai"、"Asia/Chongqing"
time():得到当前时间戳,返回自1970年1月1日00:00:00到当前的秒数
microtime() / microtime(true):得到当前微秒数(微秒数+时间戳),加了true参数则结果将以浮点数返回
date($format ,$time):格式化时间戳,输出为字符串
$time:可选参数,如果没有指定时间戳,则默认使用本地当前时间戳time()
$format参数可用格式字符串:
d 月份中的第几天,有前导0的两位数字 01~31
D 星期中的第几天,3个字母 Mon~Sun
j 月份中的第几天,没有前导0 1~31
l(L的小写) 星期几,完整的文本 Sunday~Saturday
N ISO-8601数字表示星期中的第几天 1(星期一)~7(星期天)
S 每月天数后面的英文后缀,2个字符 st、nd、rd或th,可和j一起使用
w 星期中的第几天,数字表示 0(星期天)~6(星期六)
z 年份中的第几天 0~365
W ISO-8601年份中的第几周,每周从星期一开始 如:42(当年的第42周)
F 月份,完整的文本格式 January~December
m 数字表示的月份,有前导0 01~12
M 3个字母缩写表示的月份 Jan~Dec
n 数字表示的月份,没有前导0 1~12
t 给定月份应有的天数 28~31
L 是否为闰年 如果是闰年为1,否则为0
o ISO-8601年份数字,和Y值相同 1999
Y 4位数字完整表示的年份 1999
y 2位数字表示的年份 99
a 小写的上午和下午值 am或pm
A 大写的上午和下午值 AM或PM
B Swatch Internet标准时 000到999
g 小时,12小时格式,无前导0 1~12
G 小时,24小时格式,无前导0 0~23
h 小时,12小时格式,有前导0 01~12
H 小时,24小时格式,有前导0 00~23
i 分钟,有前导0 00~59
s 秒数,有前导0 00~59
e 时区标识 如UTC、GMT
I(i大写) 是否为夏令时 如果是夏令时为1,否则为0
O 与格林威治时间相差的小时数 如+0200
P 与格林威治时间(GMT)的差别,小时和分钟间有冒号 如+02:00
T 本机所在的时区 如EST、MDT
Z 时差偏移量的秒数,UTC西边的时区偏移量总是负的,UTC东边的时区偏移量总是正的 -43200~43200
c ISO-8601格式的日期 2004-02-12T15:19:21+00:00
r RFC822格式的日期 Thu,21 Dec 2000 16:01:07 +0200
U 从Unix纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 time()
例:
echo "当前时间戳:",time(),"<br>";
echo "当前日期时间:",date("Y-m-d H:i:s",time()),"<br>";
mktime($hour_H ,$minute_i ,$second_s ,$month_n ,$day_j ,$year_Y):将时间日期转为Unix时间戳输出,时间戳是一个长整数包含了从Unix纪元到当前的秒数,该函数的参数可以从右向左省略,省略的参数会被自动设置成本地的时间日期的当前值
strtotime($strtime ,$time):将时间日期字符串解析为Unix时间戳输出,失败则返回false
$time:可选参数,如果没有指定时间戳,则默认使用本地当前时间戳time()
例1:
echo "当前日期时间戳:",strtotime ( "now" ),"<br>";
echo "2018年1月1号12:00:00的时间戳:",strtotime ( "2018-01-01 12:00:00" ),"<br>";
echo "2000年9月10号的时间戳:",strtotime ( "10 September 2000" ),"<br>";
echo "明天的这时刻:",date("Y-m-d H:i:s",strtotime( "+1 day" )),"<br>";
echo "昨天的这时刻:",date("Y-m-d H:i:s",strtotime( "-1 day" )),"<br>";
echo "下周的这时刻:",date("Y-m-d H:i:s",strtotime( "+1 week" )),"<br>";
echo "上周的这时刻:",date("Y-m-d H:i:s",strtotime( "-1 week" )),"<br>";
echo "一周零两天四小时两秒后:",date("Y-m-d H:i:s",strtotime( "+1 week 2 days 4 hours 2 seconds" )),"<br>";
echo "向上最近的一个周一:",date("Y-m-d",strtotime( "last Monday" )),"<br>";
echo "向下最近的一个周四:",date("Y-m-d",strtotime( "next Thursday" )),"<br>";
echo "一个月后:",date("Y-m-d",strtotime( "+1 month" )),"<br>";
echo "一个月前:",date("Y-m-d",strtotime( "last month" )),"<br>";
echo "十年后:",date("Y-m-d",strtotime( "+10 year" )),"<br>";
例2:
$date="2018-01-31 12:30:59";
echo "指定日期的一个月前的相同时刻:",date("Y-m-d H:i:s",strtotime("-1 month",strtotime($date)));
注意:32位系统中,有效的时间戳范围是格林威治时间1970年01月01日到2038年01月19日03:14:07,复合32位中一个整型变量所能保存的最大值,超过这个时间后整型数值将会溢出,可以使用DateTime类来解决这个问题:
例:
$date="2040-01-01 12:00:00";
$dt=new DateTime($date);
echo $dt->format('U'); // 2209032000 转成Unix时间戳
echo $dt->format('Y-m-d H:i:s'); // 2040-01-01 12:00:00 格式化输出时间日期
//将Unix时间戳转为datetime
$dt=new DateTime('@2209032000');
echo $dt->format('Y-m-d H:i:s'); // 2040-01-01 12:00:00
//使用DateTime类的setTimezone方法设置时区
$dt=new DateTime('@1420029030');
$tz=timezone_open('Asia/HONG_KONG');
$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s'); // 2014-12-31 20:30:30