修正PHP的默认时区
1 配置文件php.ini
date.timezone= Asia/Shanghai
PRC
Etc/GMT-8(东八区) (西八区 Etc/GMT+8)
(经由严格测试证明:PHP程序中, 东时区是34;-",西时区是"+")
Asia/Chongqing
Asia/Shanghai
Asia/Hong_Kong
Asia/Urumqi(乌鲁木齐)
以上属性值不区分大小写
2 date_default_timezone_set() — 设定用于一个脚本中所有日期韶光函数的默认时区
date_default_timezone_set("PRC");date("Y-m-d H:i:s",time());
UNIX韶光戳值在32位操作系统的范围: -2147483648(1901-12-14 04:51:44) 到 2147483647(2038-01-19 11:14:07);
UNIX韶光戳值在64位操作系统的范围: -9223372036854775808(-292277022657-01-27 08:29:52) 到 9223372036854775807(292277026596-12-04 15:30:07);
UNIX韶光戳元年1970年1月1日0时0分0秒, 韶光早于元年则用负数表示;
<?php$year = 1901;$month = 12;$day = 15;$birthday = mktime(0, 0, 0, $month, $day, $year);echo $birthday; //-2147472000$nowdate = time();$ageunix = $nowdate - $birthday;$age = floor($ageunix / (606024365));echo "年事:$age"; //年事:113?>date() 日期和韶光的格式化输出
string date ( string $format [, int $timestamp ] )
常用格式
月日无前导零 Y:n:j H:i:s 格式
月日有前导零 Y: m: d H:i:s 格式
H:i:s(有前导零)
在date()函数中利用转义字符
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day.
a 小写的上午和下午值,返回值am或pm
A 大写的上午和下午值,返回值AM或PM
B Swatch Internet标准时,返回值000到999
d 月份中的第几天,有前导零的2位数字,返回值01到31
D 星期中的第几天,文本格式, 3个字母,返回值Mon到Sun
F 月份,完全的文本格式,返回值January到December
g 小时,12小时格式,没有前导零,返回值1到12
G 小时,24小时格式,没有前导零,返回值0到23
h 小时,12小时格式,有前导零,返回值01到12
H 小时,24小时格式,有前导零,返回值00到23
i 有前导零的分钟数,返回值00到59
I 判断是否为夏令时,返回值如果是夏令时为1,否则为0
j 月份中的第几天,没有前导零,返回值1到31
l 星期数,完全的文本格式,返回值Sunday到Saturday
L 判断是否为闰年,返回值如果是闰年为1,否则为0
m 数字表示的月份,有前导零,返回值01到12
M 3个字母缩写表示的月份,返回值Jan到Dec
n 数字表示的月份,没有前导零,返回值1到12
o 与格林威治韶光相差的小时数,例如:0200
r RFC 822 格式的日期,例如:Thu,21 Dec 2000 16:01:07 +0200
s 秒数,有前导零,返回值00到59
S 每月天数后面的英文后缀,2个字符,例如st,nd,rd或者th。可以和j一起利用
t 指定月份所应有的天数
T 本机所在的时区
U 从Unix纪元(January 1 1970 00:00:00 GMT)开始至今的秒数
w 星期中的第几天,数字表示,返回值为0到6
W ISO-8601格式年份中的第几周,每周从星期一开始
Y 4 位数字完全表示的年份,返回值如1998、2008
y 2 位数字表示的年份,返回值例如88或08
z 年份中的第几天,返回值0到366
Z 时差偏移量的秒数。UTC西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的,返回值:—43200到43200
mktime() 将日期和韶光转变成UNIX韶光戳
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 ]]]]]]] )
<?phpecho "mktime函数返回的韶光戳:". mktime()."<br>";echo date( "M-d-Y", mktime());?>
<?phpecho date("M-d-Y", mktime(0, 0, 0, 12, 36, 2007))."\n"; //日期超过31天,打算后输出Jan-05-2008echo date("M-d-Y", mktime(0, 0, 0, 14, 1, 2008))."\n"; //月份超过12月,打算后输出Feb-01-2009echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 2009))."\n"; //没有问题的转变,输出结果 Jan-01-2009echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 99))."\n"; //会将99年转变为1999年, Jan-01-1999?>
实例:
1、PHP获取今日开始韶光戳和结束韶光戳
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
2、PHP获取昨日起始韶光戳和结束韶光戳
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
3、PHP获取上周起始韶光戳和结束韶光戳
$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));$endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));
<?php$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));$endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));echo date('Y-m-d H:i:s', $beginLastweek);echo "<br>";echo date('Y-m-d H:i:s', $endLastweek);/2018-08-13 00:00:002018-08-19 23:59:59/?>
4、PHP获取本月起始韶光戳和结束韶光戳
$beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));$endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));
把稳: 顺序不能颠倒 时 分 秒 月 日 年
time() 返回当前的 Unix 韶光戳
int time ( void )
<?phpecho "输出time()函数获取的韶光戳:".time();echo date("Y-m-D", time()); //通过date()函数转换,输出time()函数获取的韶光?>
如果你须要得到脚本实行的韶光, $_SERVER['REQUSET_TIME']优于time()。
实例:年事的打算
<?php$year = 1982;$month = 02;$day = 26;$birthday = mktime(0,0,0,$month,$day,$year);$nowdate = time();$ageunix = $nowdate - $birthday;$age = floor($ageunix/(606024365));echo "年事:$age";?>
getDate() 取得日期/韶光信息
array getdate ([ int $timestamp = time() ] )
该函数返回的关联数组元素
"seconds" 秒的数字表示 0 到 59
"minutes" 分钟的数字表示 0 到 59
"hours" 小时的数字表示 0 到 23
"mday" 月份中第几天的数字表示 1 到 31
"wday" 星期中第几天的数字表示 0 (周日) 到 6 (周六)
"mon" 月份的数字表示 1 到 12
"year" 4 位数字表示的完整年份 比如:1999 或 2003
"yday" 一年中第几天的数字表示 0 到 365
"weekday" 星期几的完全文本表示 Sunday 到 Saturday
"month" 月份的完全文本表示 比如 January 或 March January 到 December
自从 Unix 纪元开始至今的秒数,和 time() 的返回值以及用于 date() 的值类似。
系统干系,范例值为从 -2147483648 到 2147483647。
<?php$today = getdate ();print_r ( $today );?>
以上例程的输出类似于:
Array([seconds] => 40[minutes] => 58[hours] => 21[mday] => 17[wday] => 2[mon] => 6[year] => 2003[yday] => 167[weekday] => Tuesday[month] => June[0] => 1055901520)
microtime() 返回当前 Unix 韶光戳和微秒数
mixed microtime ([ bool $get_as_float ] )
默认值(false)返回当前UNIX韶光戳和微秒数, 返回格式为"msec sec"的字符串, 个中sec是当前的UNIX韶光戳, msec是微秒数 0.87008800 1398782702
参数设为true, 则返回值为浮点数, 小数点前因此韶光戳形式表示, 小数点后面表示微秒(即sec.msec) 如:1398782640.64
<?phplist($t1, $t2) = explode(' ', microtime()); //默认值为fasleecho $t1; //微秒 window 0.43600000 linux 0.56622600echo "<br>";echo $t2; //秒?>
把稳: 1秒 = 1000毫秒 1毫秒=1000微秒
<?phpclass Timer { //声明一个打算脚本运行韶光的类private $startTime; //保存脚本开始实行时的韶光(以微秒的形式保存)private $stopTime; //保存脚本结束实行时的韶光(以微秒的形式保存)function __construct(){ //布局方法,在创建工具时初使化成员属性$this->startTime=0; //初使化成员属性startTime的值为0$this->stopTime=0; //初使化成员属性stopTime的值为0}function start(){ //在脚本开始处调用获取脚本开始韶光的微秒值$this->startTime = microtime(true); //将获取的韶光赋给成员属性$startTime}function stop(){ //在脚本结束处调用获取脚本结束韶光的微秒值$this->stopTime= microtime(true); //将获取的韶光赋给成员属性$stopTime}function spent(){ //返回同一脚本中两次获取韶光的差值return round(($this->stopTime- $this->startTime) , 4); //打算后以4舍5入保留4位返回}}$timer = new Timer(); //创建Timer类的工具$timer->start(); //在脚本文件开始实行时调用这个方法usleep(1000); //脚本的主体内容,这里以休眠一毫秒为例$timer->stop(); //在脚本文件结尾处调用这个方法echo "实行该脚本用时<b>".$timer->spent()."</b>秒"; //输出页面实行时运行的韶光?>
usleep() 以指定的微秒数延迟实行
void usleep ( int $micro_seconds )
sleep() 程序延迟实行指定的 seconds 的秒数。
int sleep ( int $seconds )
strtotime() 将任何英文文本的日期韶光描述解析为 Unix 韶光戳
int strtotime ( string $time [, int $now ] )
本函数预期接管一个包含美国英语日期格式的字符串并考试测验将其解析为 Unix 韶光戳(自 January 1 1970 00:00:00 GMT 起的秒数),
其值相对付 now 参数给出的韶光,如果没有供应此参数则用系统当前韶光。
echo strtotime ("now"), "\n";echo "输出韶光:".date("Y-m-d H:i:s",strtotime ("now")),"<br>";echo strtotime ("21 May 2007"), "\n"; //等同于strtotime ("May 21 2007")echo "输出韶光".date("Y-m-d H:i:s",strtotime ("21 May 2007")),"<br>";echo strtotime ("+3 day"), "\n";echo "输出韶光".date("Y-m-d",strtotime ("+3 day")),"<br>";echo strtotime ("+1 week"), "\n";echo strtotime ("+1 week 2 days 3 hours 4 seconds"), "\n"; //相称于 +1 week +2 days +3 hours +4 seconds "+"号可以省略echo strtotime ("next Thursday"), "\n";echo strtotime ("last Monday"), "\n";
本示例的运行结果如下。
1184132969 输出韶光:2007-07-11 13:49:29
1179676800 输出韶光2007-05-21 00:00:00
1184392169 输出韶光2007-07-14
1184737769 1184921373 1184774400 1183910400
解释:有效的韶光戳范例范围是格林威治韶光1901年12月13日20:45:54到2038年1 月19日03:14:07。(此范围符合32位有符号整数的最小值和最大值)。
在Windows系统中此范围限定为从1970年1月1日到2038年1月19日。
提醒:
$date = strtotime("- 3 month +2 year");echo date("Y-m-d H:i:s", $date); //2019-09-14 10:32:16echo "<br>";$date = strtotime("+2 year - 3 month ");echo date("Y-m-d H:i:s", $date); //2019-09-14 10:32:16
year、month、week、day、hour、minute、second 可以任意调换顺序。
gmdate() 格式化一个 GMT/UTC 日期/韶光
string gmdate ( string $format [, int $timestamp ] )
<?php$then=gmdate('D, d-M-Y H:i:s',time()+3600)." GMT"; //格式化韶光header("Expires:$then"); //定义文档过期韶光?>
mixed date_sunrise ( int $timestamp [, int $format [, float $latitude [, float $longitude [, float $zenith [, float $gmt_offset ]]]]] )
返回给定的日期与地点的日出韶光
format 常量
SUNFUNCS_RET_STRING 以 string 格式返回结果 16:46
SUNFUNCS_RET_DOUBLE 以 float 格式返回结果 16.78243132
SUNFUNCS_RET_TIMESTAMP 以 integer 格式(韶光戳)返回结果1095034606
latitude 默认是指北纬。因此如果要指定南纬,必须通报一个负值。
longitude 默认是指东经。因此如果要指定西经,必须通报一个负值。
Zenith 天顶,默认值"90.83"
gmt_offset 参数的单位是小时(时区)。 东八区:8 西五区:-5
<?php/ 打算葡萄牙里斯本的日出韶光Latitude: 北纬 38.4 度Longitude: 西经 9 度Zenith ~= 90offset: +1 GMT/echo date("D M d Y"). ', sunrise time : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);?>
Mon Dec 20 2004, sunrise time : 08:54
mixed date_sunset ( int $timestamp [, int $format [, float $latitude [, float $longitude [, float $zenith [, float $gmt_offset ]]]]] )
返回给定的日期与地点的日落韶光
<?php/ 打算葡萄牙里斯本的日落韶光Latitude: 北纬 38.4 度Longitude: 西经 9 度Zenith ~= 90offset: +1 GMT/echo date("D M d Y"). ', sunset time : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);?>
Mon Dec 20 2004, sunset time : 18:13
利用格式:
日出:date_sunrise(韶光戳,格式,纬度,经度,天顶,时区)
日落:date_sunset(韶光戳,格式,纬度,经度,天顶,时区)
打算荆州日出日落韶光:
<?php/ 打算荆州的日出韶光Latitude: 北纬 30.33 度Longitude: 东经 112.23 度Zenith ~= 90offset: +8 GMT/date_default_timezone_set("PRC");echo 'sunrise time : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 30.33, 112.23, 90, 8);echo "<br />";echo 'sunrise time : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 30.33, 112.23, 90, 8);?>
扩展:
$_SERVER['REQUEST_TIME']返回当前的韶光戳
你在非专业场景下面, 你可以来判断某些函数实行效率是否过高。5000次
用$_SERVER['REQUEST_TIME'] 在单词要求的时候, 他要求韶光的效率要比time()函数高, 最少快四倍,
但是如果要求多次, 例如要求5万次$_SERVER['REQUEST_TIME']的效率, 就要低于time()函数
实例1:
PHP打算一个月每一天开始韶光(0:00)和结束韶光(23:59)的unix韶光戳
<?php$arr = array();for($i=0;$i<=30;$i++){ //开始韶光 $beginTime=mktime(0,0,0,date('m'),date('d')-$i,date('Y')); $endTime=mktime(0,0,0,date('m'),date('d')+1-$i,date('Y'))-1; $arr[] = array("beginTime"=>$beginTime, "endTime"=>$endTime);}echo "<pre>";print_r($arr);echo "</pre>";?>
PHP 打算一个月内逐日当前的unix韶光戳(第一天和第二天)
<?php$arr = array();for($i=0;$i<=30;$i++){$startI = -$i;$endI = -$i+1;$arr[] = array('starttime'=>strtotime("$startI day"), 'endtime'=>strtotime("$endI day"));}echo "<pre>";print_r($arr);echo "</pre>";?>
实例2:
<?php//$startdate = "2017-2-22 00:00:00";$startdate = "22-feb-2017"; //strtotime函数很灵巧, 22-feb-2017是域名注册的日期常用的格式$enddate = "2017-5-8 00:00:00";$date = floor((strtotime($enddate) - strtotime($startdate)) / 86400);echo "相差天数:" . $date . "天<br/><br/>";$hour = floor((strtotime($enddate) - strtotime($startdate)) % 86400 / 3600);echo "相差小时数:" . $hour . "小时<br/><br/>";$minute = floor((strtotime($enddate) - strtotime($startdate)) % 86400 / 60);echo "相差分钟数:" . $minute . "分钟<br/><br/>";$second = floor((strtotime($enddate) - strtotime($startdate)) % 86400 % 60);echo "相差秒数:" . $second . "秒";?>
实例3
//下单韶光限定$beginToday=mktime(8,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(11,30,0,date('m'),date('d'),date('Y'));$now = time();if($now < $beginToday || $now > $endToday){$this->message('支付订单的韶光只能在8:00--11:30'); //微擎框架的方法}
实例4
如何天生java 13位格式的韶光戳(毫秒级)
<?phpdate_default_timezone_set("PRC");function getMillisecond() {list($t1, $t2) = explode(' ', microtime());return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))1000);}echo getMillisecond(); //1510123955309echo "<br>";echo date("Y-m-d H:i:s", round(getMillisecond()/1000)); //2017-11-08 14:52:35