php关于时区dategmdatedate_default_timezone_setget终极
答疑
关于GMT和UTC时间?
GMT+0800
Greenwich: [gri:nitf], 格林威治/格林尼治.是英国伦敦泰晤⼠河附近的⼀个⼩镇
Mean: adj. ⾃私的; n. 平均..
he is mean about money.
GMT就是格林威治平均/标准时间
什么叫本初⼦午线?
国外叫 : prime mer'idian.只是在中国内才叫本初-⼦午线. 只是国内的翻译这样怪怪的.
prime 被国⼈翻译为本初,
meridian本意是 经线的/全盛的, 顶点的:
he is "at the meridian of " life.
he was "at the meridian of " his power then.
⽽在中国, ⼦为北⽅, 午为南⽅, ⼦午即南北⽅向, 所以就把经线 "南北线" 翻译成了⼦午线.
因此, ⼦午线只是中国的叫法, 国外没有 "⼦午" 这种天⼲地⽀的说法的.
经纬线都是假想 (imaginary)出来的线, ⾚道是天然的纬线.经线从理论上来说, 任何连接南北两极的圆线都可以作为
prime meridian, ⽐如中国清朝的时候,还提出了⾃⼰的prime meridian. 因此, 需要从⽆数的⼦午线中 ⼈为
地选出⼀条作为"⾸⼦午线". 因为英国皇家天⽂台(Greenwich天⽂台)最先测量经线的长度, 所以把经过 Greenwich 天⽂台
⼦午仪中⼼的⼦午线作为经线的起点, 即0度⼦午线, 本初⼦午线.
Greenwich Village = the Village不是在英国, ⽽是在美国纽约.
GMT ⼜叫 UT0
经过 "地轴摆动"修正后的时间 叫 UT1, UT2
由铯原⼦钟提供的时间叫 "国际原⼦时" :TAI
那么, 把以上的所有时间: UT0, 1,2 TAI综合精确计算 提供的 "世界协调时" 就叫 UTC .
UTC与真的太阳时的误差在0.9秒内.否则, 要由巴黎...发布 "闰秒".
UTC: universal time coordinated.
通常在程序中, php和javascript, jquery中, 就认为GMT和UTC是⼀样的, 没有区别的.
⽽CST, 则有 多义/歧义 解释了.
可以是 美国或澳⼤利亚的 Central Standard Time(中部标准时间)
也可以是 中国或古巴的标准时间: China/Cuba Standard Time
⽽在不同的语⾔中, 如php, java, 和 javascript中, 解释器/编译器对CST的理解不同, ⽽出错.
所以, 在编程中, 尽量少⽤ CST.
php和js/jquery中对时间/时区的操作?
获得时间的函数:
php是 $dt = time()
js/jq 是 var dt = new Date();
北京时间和伦敦时间
// php中的time()时获得GMT时间戳的秒数. 是两个GMT时间的差 : 是指当前GMT英国Greenwich 0 时区的GMT时间
// 和unix纪元的时间差.  跟php系统设置的时区⽆关!
也就是说, php的time()函数, 在某⼀时刻, ⽐如现在这⼀时刻, 在地球上的任何地⽅都是相同的. 因为他们都是返回的在伦敦的Greenwich的GMT时间.⽽不是本地时间, 所以跟php的系统
设置时区⽆关.
对⽇期/时间的操作
js获得new Date()对象后, 有丰富的成员函数来进⾏操作, 如getMonth, getDate, getDay, toString,UTC()等等
对php的时间操作, 主要是date和gmdate的格式化问题
echo date("Y-m-d H:i:s");
// date() 返回的是: 当前(这⼀刻 time()函数执⾏/返回时) GMT标准时间的"本地化时间" 的⾃定义格式时间
// date()跟php系统设置的时区有关!
echo gmdate("Y-m-d H:i:s");
// gmdate() 返回的是: 当前(这⼀刻 time()函数执⾏/返回时) GMT标准时间的⾃定义格式时间
// gmdate() 跟你现在所处的位置⽆关, 跟php系统设置的时区⽆关!
也就说, date()和gmdate()的区别, 仅仅在于处理的时间是不同的!
strtotime("str")
strtotime("str"): 返回 string给定时间的所对应的GMT标准时间的 unix时间戳,
如果当前php系统的设置的时区不是GMT标准时区,则在应⽤strtotime(string)时,系统会⾃动把时间
string折算成相应的GMT标准时间,然后计算这个时间的unix时间戳。跟php系统设置的时区有关
关于时区
地球(地球和太阳在宇宙中的相对位置,和⼈类历史⽂化的原因)是⾃西向东⾃转,东边⽐西边先看到太阳,
东边的时间也⽐西边的早. 东边时刻与西边时刻的差值不仅要以时计,⽽且还要以分和秒来计算,
这给⼈们带来不便. 
为了克服时间上的混乱, 1884年 在华盛顿召开的⼀次国际经度会议(⼜称国际⼦午线会议)上,
规定将全球划分为24个时区.它们是中时区(零时区)、东1-12区,西1-12区.
每个时区横跨经度15度,时间正好是1⼩时.最后的东、西第12区各跨经度7.5度,以东、西经180度为界.
每个时区的中央经线上的时间就是这个时区内统⼀采⽤的时间,称为区时.相邻两个时区的时间相差1⼩时.
例如,我国东8区的时间总⽐泰国东7区的时间快1⼩时,⽽⽐⽇本东9区的时间慢1⼩时.
因此,出国旅⾏的⼈,必须随时调整⾃⼰的⼿表,才能和当地时间相⼀致.
凡向西⾛,每过⼀个时区,就要把表向前拨1⼩时(⽐如2点拨到1点);凡向东⾛,每过⼀个时区,就要把表向后拨1⼩时(⽐如1点拨到2点). 
实际上,世界上不少国家和地区都不严格按时区来计算时间.为了在全国范围内采⽤统⼀的时间,
⼀般都把某⼀个时区的时间作为全国统⼀采⽤的时间.
例如,我国把⾸都北京所在的东8区的时间作为全国统⼀的时间,称为北京时间.
⽽实际上, 我国整个⾯积范围共跨了5个时区.
⼜例如,英国、法国、荷兰和⽐利时等国,虽地处中时区,但为了和欧洲⼤多数国家时间相⼀致,则采⽤东1区的时间.如何设置php中的时区? 两种⽅法
1. 如果可以修改服务器, 就在服务器中修改phh.ini⽂件:
[Date]
; Defines the default timezone used by the date functions
date.timezone = Asia/Shanghai 或者 Asia/Chongqing 或者 PRC
// 注意, 没有北京 Asia/Beijng
// 更注意的是, 如果phi.ini中没有[Date] date.timezone的话, 就要⾃⼰⼿动添加.
1. 如果没有权限 不能 修改服务器上的php.ini, 就⽤函数⽅法
// ⼀般,最好在初始化⽂件中写
// 或调⽤时间函数之前, 写
ini_set('date.timezone', 'Asia/Shanghai 或者Asia/Chongqing 或者PRC');
ini_set('date.timezone', 'Etc/GMT-8'); // 后⾯是 -8 减8 , 这个Etc是linux中的/etc⽬录吗? 那最好不⽤?
date_default_timezone_set('Asia/Shanghai 或者Asia/Chongqing 或者PRC');
使⽤date_default_timezone_get()就可以获得系统当前设置的时区.
或者, 不⽤设置时区, 直接⼿动调整时间:
在显⽰/输出时间时, 都统⼀处理:
不使⽤date()
统⼀使⽤gmdate(), 但是在时间上加上 8*3600 这么多秒到time()上去!
1. php ⼿册上说的: date_default_timezone_set⾃ PHP 5.1.0 起(此版本⽇期时间函数被重写了),
string date_default_timezone_get ( void )
本函数返回  "默认时区" ,使⽤如下“假定”的顺序:
■⽤ date_default_timezone_set() 函数设定的时区(如果设定了的话)
■TZ 环境变量(如果⾮空)
■date.timezone 配置选项(如果设定了的话)
■⾃⼰推测(如果操作系统⽀持)
■如果以上选择都不成功,则返回 UTC
string date/gmdate ( string $format [, int $timestamp ] )
返回将整数 timestamp 按照给定的格式字串⽽产⽣的字符串。
如果没有给出时间戳则使⽤ "本地" 当前时间。换句话说,timestamp 是可选的,默认值为 time()。
如果没有给出时间戳则使⽤ "本地" 当前时间。换句话说,timestamp 是可选的,默认值为 time()。
<?php
// date_default_timezone_set('Asia/Chongqing');
// ini_set('date.timezone', 'PRC');
/
/ ini_set('date.timezone', 'prc');
$tz = date_default_timezone_get();
echo "默认时区是: $tz";
/* 好像没有设置TZ  (timezone) 这个常量 */
if(defined('TZ')) echo TZ;
echo "<br />";
echo time();
echo "<br />";
echo gmdate('Y-m-d H:i:s');
echo "<br />";
echo date('Y-m-d H:i:s');
>
那么time()函数的内部实现, 是不是通过⽹络去访问 Greenwich的" 相关时间服务器" ⽽得到的呢? 好像不是, 因为即使是断了⽹, 还是能够获得time()函数的值? 应该是通过操作系统去实现
的??