關於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中的時區? 兩種方法
- 如果可以修改服務器, 就在服務器中修改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的話, 就要自己手動添加.
- 如果沒有權限 不能 修改服務器上的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()上去!
- 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');
?>