時間和時區CST UTC GMT的說明及設定

URL Link //n.sfs.tw/10481

2016-12-25 10:36:20 By 張○○

GMT, UTC, DST, CST

格林威治標準時間GMT

      英國1884年決定以通過格林威治的子午線作為劃分地球東西兩半球的經度零度。觀測所門口牆上有一個標誌24小時的時鐘,顯示當下的時間。對全球而言,這裡所設定的時間是世界時間參考點,全球都以格林威治的時間作為標準來設定時間,這就是我們耳熟能詳的「格林威治標準時間」(Greenwich Mean Time,簡稱G.M.T.)的由來。

世界協調時間UTC

      多數的兩地時間表都以GMT來表示,但也有些兩地時間表上看不到GMT字樣,出現的反而是UTC這3個英文字母,究竟何謂UTC?事實上,UTC指的是 Coordinated Universal Time- 世界協調時間(又稱世界標準時間、世界統一時間),是經過平均太陽時(以格林威治時間GMT為準)、地軸運動修正後的新時標以及以「秒」為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密,因此若以「世界標準時間」的角度來說,UTC比GMT來得更加精準。其誤差值必須保持在0.9秒以內,若 大於0.9秒則由位於巴黎的國際地球自轉事務中央局發佈閏秒,使UTC與地球自轉週期一致。所以基本上UTC的本質強調的是比GMT更為精確的世界時間標準,GMT與UTC的功能與精確度是沒有差別的

夏日節約時間DST

      所謂「夏日節約時間」Daylight Saving Time(簡稱D.S.T.),是指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提早日光的使用,在英國則稱為夏令時間(Summer Time)。這個構想於1784年由美國班傑明·富蘭克林提出來,1915年德國成為第一個正式實施夏令日光節約時間的國家,以削減燈光照明和耗電開支。 自此以後,全球以歐洲和北美為主的約70個國家都引用這個做法。

CST時間

CST卻同時可以代表如下 4 個不同的時區:
   Central Standard Time (USA) UT-6:00
   Central Standard Time (Australia) UT+9:30
   China Standard Time UT+8:00
   Cuba Standard Time UT-4:00

上面的資料編修自[1]

可見,CST可以同時表示美國,澳大利亞,中國,古巴四個國家的標準時間。因此,一個簡單的換算:

GMT + 8 = UTC + 8 = CST

我自己的解釋,因為國際換日線後四小時就是台灣中國的時區,再經過八小時到英國GMT,那表示CST比GMT快八個小時。

說穿了,UTC就是英國當地的時間,誰叫他要是制定時間時的強國,舉例言,UTC1:00代表英國當時是1:00早上天還沒亮的凌晨,這時台灣因為是UTC+8的時區,台灣此時已經是早上9:00了的股票開盤時間;同時,由於日本是UTC+9的時區,他們已經是10:00了。而同時的美國東部加紐約的時區是UTC-5,他們還是1:00-5:00=-4:00也就是前一天,而且還要4:00才過隔天,換句話說是前一天的20點,紐約當地晚上10點。 這也是為什麼星期五我們股市收盤完了,等到了我們的晚上10:30左右美國紐約股市才開盤,原來這時只是美國的星期五早上9:30而已,我們星期五的這天都快過完了,他們的星期五才剛開始呢!
我想最衝突的應該算是國際換日線上的國家,例如東加和薩模亞SAMOA,他們的時區是+13,代表全世界首先到隔天的就是他們,可是很衝突的是就他們的鄰島美屬薩模亞,才隔20公里而已,他們的時區是-11,這代表說薩模亞如果已經是星期一要上班的時間,搭船到20公里外的美屬薩模亞,他們的星期日才剛開始呢。或是說當美屬薩模亞的美軍星期日要去薩模亞玩的時候,薩模亞已經是星期一。

設定時間

[FREEBSD]

設定時間為 20101220 11:00,格式 date yymmddhhmm.ss
# date 1012201100.00

查看系統時間
# date
2010年12月20日 周一 11時06分03秒 CST

修改時區,在FREEBSD要修改時區只要把那個時區的設定檔複製到 /etc/localtime

# cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime
修改 Kernal time (adjkerntz = adjust kernal timezone)
# adjkerntz -a

# 微調時脈 Linux's adjtimex(2) is called ntp_adjtime(2) in FreeBSD.
註:據說在 FREEBSD 中沒有相對應於 hwclock 的指令,同時以上所有指令取出的時間都是 BIOS時間,而不是系統本身的時間??

利用 NTP 校時
# ntpdate -v -b time.stdtime.gov.tw
20 Dec 11:23:31 ntpdate[53976]: ntpdate 4.2.4p5-a Sun Dec  7 02:16:44 UTC 2008 (1)
20 Dec 11:23:32 ntpdate[53976]: step time server 163.17.40.2 offset 0.152610 sec

[LINUX]

設定時間為 20101220 11:00  格式為 date MMDDhhmmYYYY
# date 122011002010

讀取 BIOS 時間
# hwclock -r read
將系統時間-->硬體時間
# hwclock -w
將硬體時間-->系統時間
# hwclock --hctosys

利用 NTP 校時
# ntpdate -s ntpdate -s time.stdtime.gov.tw

修改時區
# cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime

# vi /etc/sysconfig/clock
ZONE="Asia/Taipei"
UTC=false
ARC=false

PHP中timezone的設置

在php升級到5.3後會出現錯誤,這個是時區上的錯誤:

PHP Fatal error:  Uncaught exception 'VerboseException' with message 'date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead' in ....

PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in .... on line ...

因此得修改了php.ini 中的timezone

# vi /etc/php.ini

把這行改為Asia/Taipei即解決:
date.timezone = "Asia/Taipei"

中國可改為 Asia/Shanghai或Asia/Chongqing,不要改為 Asia/Beijing 錯誤的設定

延伸閱讀

- [Centos8] 校時ntpdate? @新精讚

- Linux shell 的date表示法

- 多出的一秒鐘~閏秒

- Perl 的日期和時間

參考資料

[1] http://www.51testing.com/?uid-248074-action-viewspace-itemid-209865

[2] 維基百科的時區地圖高清

[3] http://labs.almerblank.com/2009/10/amfphp-fatal-errors-after-php-5-3-upgrade-part-1/


原文 2010-12-20 10:43:51 2011-02-01 15:45:50