PHP 时区

1. 如何设置PHP时区?
经常存在PHP中date结果和系统时间不一致, (对于我们最常见是慢8小时). 究其原因, 中国处于东八区, 所在系统设置了时区, 但是PHP未设置时区. 那么如何设置PHP时区? 有两种方法:
1.1 php.ini中
date.timezone = [Asia/Shang|Asia/Chongqing|Etc/GMT-8|PRC]
1.2 date_default_timezone_set([Asia/Shang|Asia/Chongqing|Etc/GMT-8|PRC]);

2. PHP中日期函数和时区
地理学中以格林尼治时间为标准时间. Internet上使用该时间为通用协调时(UTC, Universal Time Coordinated), 即: GMT(Greenwich Mean Time).
2.1 time(): 标准时间戳, 指返回自从Unix纪元 (格林威治时间1970-01-01 00:00:00) 到当前GMT标准时间的秒数, 与PHP系统设置的时区无关。
2.2 date(): 某GMT标准时间本地化"自定义格式"时间, 跟php系统设置的时区有关.
2.3 gmdate(): 某GMT标准时间的"自定义格式"时间, 跟php系统设置的时区无关.

3. 假设我在北京, 想获得n天前凌晨的格式化时间. 简化一下, 假设n=0, 当前时间为中午12点. 求今天0点的格式化时间.
time(): 得到当前GMT标准时间. 伦敦当前时间:(04:00:00).
time()+3600*8: 8小时后, GMT标准时间. 伦敦8小时后时间戳(12:00:00).
intval((time()+3600*8)/(3600*24))*(3600*24): GMT标准下, 本地时间的凌晨时间戳. 伦敦当日凌晨(00:00:00)
intval((time()+3600*8)/(3600*24))*(3600*24)-3600*8: GMT标准, 本地时间凌晨时间戳. 伦敦前一日(16:00:00)北京(00:00:00)
date('Y-m-d H:i:s', intval((time()+3600*8)/(3600*24))*(3600*24)-3600*8): 根据本地时区, GMT(16:00:00)PRC(00:00:00)
intval((time()+28800)/$g)*$g-28800转换为格式化日期. 即: today算法.
求n天前的凌晨时间:
date('Y-m-d H:i:s', intval((time()+3600*8-3600*24*n)/(3600*24))*(3600*24)-3600*8);
date('Y-m-d H:i:s', strtotime('today')-3600*24*n);

参考:
http://www.cnblogs.com/xmphoenix/archive/2011/06/30/2095022.html

原文地址:https://www.cnblogs.com/codesay/p/3580712.html