php 中關於時區的那點事

2020-12-05 雪之夢技術驛站

科普一下什麼是時區

眾所周知,地球繞著太陽轉的同時也會自轉,因此同一時刻不同地區所接收到太陽照射的情況不同,所以有的地區是日出,有的地區是日落,還有的地區可能是黑夜.

既然地球上的不同地區時間不同,那總要有統一的時間刻度才能方便文化科技交流吧,不然大家說的都是當地時間,這樣豈不是亂套了?

有問題就要解決問題,不同地區時間不同就要統一時間標準,而統一時間標準的前提就是要弄清楚全球的時間差異到底在哪以及各地的當地時間如何互相轉換.

原來的時間標準是格林尼治標準時間,隨著精確計時的發展需要,已被新的時間標準所取代,目前的時間標準是世界協調時.

現在有了統一的時間標準,不同地區的時間就可以統一換算成世界協調時再轉換成當地時間了,再也不會出現同一時刻不同時間了!

示例:

北京時間(UTC+8) : 2019-05-30 13:30:00世界時間(UTC) : 2019-05-30 05:30:00東部時間(UTC-5) : 2019-05-30 00:30:00格林尼治標準時間

格林尼治標準時間(又稱格林威治平均時間格林威治標準時間,英文是GreenwichMeanTime,簡稱GMT),格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治時)的時間.

格林尼治是英國倫敦的一個小鎮,是地理經度的起點,本初子午線所在的經度是零度經度,所在的時區是零時區.

我們知道一天共有 24 小時,對應著全球 24 個時區,而地球自西向東自轉,零時區後依次是東一區到東十一區,然後是東十二區.緊接著是西十二區,西十一區到西一區,最後又回到零時區.

其中東十二區和西十二區是同一個時區,又被稱為東西十二區.

總的來說,時區分為東十二區和西十二區以及零時區,其中東西十二區是同一個時區,因此共有 24 個時區.

示例:

由於北京位於東八區,比零時區多個 8 個時區,意味著北京時間比格林標準時間8 個小時.

所以,北京時間中午 12 點整的時候,格林尼治才清早 4 點鐘,估計還在睡覺呢! ( GMT+8 就是北京時間)

格林尼治標準時間與地球自轉有關,不能滿足精確計時的需求,因此不再作為標準時間,取而代之的是協調世界時.

協調世界時

協調世界時(又稱世界統一時間世界標準時間國際協調時間,英文是Coordinated Universal Time,簡稱UTC),協調世界時是以原子時秒長為基礎,在時刻上儘量接近於格林尼治標準時間的一種時間計量系統.

不需要精確到秒的情況下, GMT 和 UTC 基本一致,但 UTC 是以更加精確的原子時為基礎,因此常用於科學計算領域,也是目前時間計量的統一標準.

示例:

北京時間 12:00 ,換算成 GMT 或 UTC 時間都是 04:00 ( UTC+8 也是北京時間)

北京時間

北京時間(又稱中國標準時間),是首都北京所在的時區作為中國的標準時間,比格林尼治標準時間快8小時.

我國幅員遼闊,從西到東橫跨東五,東六,東七,東八和東九等五個時區.所以全國統一採用首都北京所在的東八時區的區時作為標準時間,也就是北京時間.

時區信息資料庫

時區信息資料庫,又稱 Olson資料庫,是一個主要應用於電腦程式以及作業系統的可協作編輯世界時區信息的資料庫.

時區信息資料庫採用按「區域/位置」命名規範,方便應用於計算機世界,其中英文地名中的空格用下劃線「_」代替,連詞符「-」只在英文地名本身包含時使用.

示例:

Asia/Hong_Kong : 亞洲/香港Asia/Macau : 亞洲/澳門Asia/Shanghai : 亞洲/上海Asia/Taipei : 亞洲/臺北Asia/Urumqi : 亞洲/烏魯木齊上述時區主要是 php 中所支持的中國時區,參考 亞洲所支持的時區列表

關於時區的編程實現

時區不僅僅是現實生活的問題,計算機編程世界也有時間,自然也離不開時區的概念.

在計算機世界中,一切都是數據,最好時區的概念也能體現在相關資料庫中,幸運的是已經有前輩為我們提供了時區信息資料庫,而各類語言基本都會提供時區的工具類.

php 中的日期時間函數庫是 php內置函數庫,我們可以方便地操作時間,設置時區等.

正常情況下, date 擴展默認是啟用的,我們可以輸入 phpinfo 列印出 php 的基本信息,然後搜索關鍵字 date 就可以找到關於 date 擴展的相關信息.

示例

結果默認時區:當前時區: UTC當前時間: 2019-05-30 05:30:00

由此可見,假設不設置時區的話,默認時區是協調世界時,該時區和北京時間相比慢 8 個小時!

設置時區的三種姿勢

翻閱 php 開發文檔中可以找到目前所有支持時區列表,下面整理出關於中國的主要時區.

Asia/Hong_Kong : 亞洲/香港Asia/Macau : 亞洲/澳門Asia/Shanghai : 亞洲/上海Asia/Taipei : 亞洲/臺北Asia/Urumqi : 亞洲/烏魯木齊常用時區是上海,並沒有北京,當然也可以設置成 PRC (中華人民共和國)!

如果沒有設置時區的話,默認時區應該是協調世界時(UTC),雖說是通用的時間標準,但轉換成當地時間還是需要一定換算的,而且看起來也不太舒服.

所以最好還是修改一下時區的設置項,如果業務不考慮國際化需求,那麼永久性把時區固定就可以了,如果有國際化的業務場景,那麼最好能夠動態設置時區,這樣就能清楚知道當地時間了.

因此,下面主要提供兩種方式來設置時區,分別是靜態設置和動態設置,其中動態設置又提供了兩種方法.

靜態修改 php 配置

php 的配置文件默認位於 : /private/etc/php.ini ,打開文件後修改 date.timezone 選項.

由於這種方法是直接修改配置文件,因此時區設置後適用於所有腳本,只不過需要重啟伺服器方可生效.

示例

結果# 去掉;並設置時區,取值可以是PRC,也可以是Asia/Shanghai等時區date.timezone = PRC詳情請參考: http://php.net/date.timezone

動態設置 php 配置

ini_set 支持設置當前腳本的默認時區選項.

靜態設置時區僅僅適合時區固定的情況,如果需要動態切換時區,修改配置文件就不能滿足這種情況了.

因此,php 中還提供了動態修改 php.ini 配置文件的方法,ini_set() 方法剛好支持動態設置時區.

不用重啟伺服器,但僅僅針對當前腳本生效,其中 ini_set 方法支持的 php.ini 配置選項列表

示例

結果當前時區: Asia/Tokyo當前時間: 2019-05-30 14:30:00

動態設置 php 時區

date_default_timezone_set 方法用於設置當前腳本的默認時區.

ini_set 雖然支持設置時區選項,但畢竟不是專業設置時區的方法,date_default_timezone_set 才是專門設置時區的方法.

這兩個方法都屬於動態設置時區,也都是針對當前腳本生效,也都不用重啟伺服器就能立馬生效.

示例

結果當前時區: Asia/Tokyo當前時區: UTC當前時間: 2019-05-30 05:30:00

關於時區的一些總結

時區和時間密切相關,統一時間說的其實是統一時間的標準,這樣一個地區的當地時間就可以輕易轉換成另一個地區的當地時間了.

目前世界上統一的時間標準是協調時間時(UTC),中國的時間標準是北京時間,北京時間比協調時間時快 8 個小時.

現實世界的時區也要反映到計算機世界,其中時區信息資料庫就是用於表示現實世界的時區概念.

由此可見,時區是一個通用概念,不僅 php 有時區,java 和 js 等語言也有時區概念,可以說只要有時間的地方都離不開時區.關於時區的小技能,你 get 到了嗎?

美劇<<閃電俠>>當地時間是星期二晚上八點開播,請問北京時間何時開播?英劇<<神探夏洛克>>北京時間凌晨四點半開播,請問當地時間是何時開播?泰劇<<新鐵石心腸>>當地時間是晚上九點二十開播,請問北京時間是何時?參考資料

時區相關知識掃盲時區時差時間換算

相關焦點

  • 關於時區的10個鮮為人知的事實
    國家是多種多樣的,但它們有一個共同點,那就是它們在一個時區中的位置。沒有這些無形的經線,世界將是一個非常不同的地方。你的時區在很大程度上決定了你什麼時候起床,睡覺,吃飯,看你喜歡的電視節目。但時區包含了許多不一致的地方,因為你馬上就要發現了。
  • 玩轉地理 | 世界時區的那些事
    正式的時區劃分,其中包括24個時區,每一時區由一個英文字母表示。每隔經度15°劃分一個時區,有一個例外,每個時區有一條中央子午線。但由於各種各樣的原因,我們會見到一些奇怪的時區分法  1.半區計時法:根據本國所跨經度範圍,採用與中央經線相差7.5°的時區的邊界經線的地方時。例如,印度採用東5.5區。
  • php中函數禁用繞過的原理與利用
    我談談我個人的幾個偏向點:版本號最直觀的就是php版本號(雖然版本號有時候會在響應頭中出現),如我的機器上版本號為:PHP Version 7.2.9-1那麼找到版本號後就會綜合看看是否有什麼"版本專享"漏洞可以利用。
  • 關於PHP 5.4 你所需要知道的
    我們要建2個類,如果是以前,我們需要寫一個cURL的方法並且複製/粘貼到兩個類中。現在不用了,使用Traits重用代碼吧,這次真正地遵循了DRY(Don’t Repeat Yourself)原則。那你來瞅瞅更簡單的例子123456789101112131415161718
  • 一口氣看懂「時區」裡的秘密
    在網上一直流傳著一個關於美國的笑話,一個美國網友知道了北京時間比紐約早14個小時,憤怒的指責中國人為什麼不在9月11日的前一天晚上警告美國第二天會發生恐怖襲擊。但是隨著航海大發現,啟蒙運動,一二次工業革命等等事件的發生,世界已經緊密地連接成一個個體,在幾萬公裡以外的美國剛發生的事情,一秒鐘就能通過網絡傳遞到你的手機上,在這個時候,每個地方的時間不一樣就會造成很大的麻煩,如果每個地方都把日出時間定為早上六點,那世界上會有無數個早上六點,各種國際會議,國際航班基本都無法進行了。
  • 法國科學家揭秘「25時區」事件
    事情開始於網絡上一篇關於法科學家宣布全球將增添第「25時區」的新聞。
  • 中國橫跨5個時區,為什麼不區分時區?
    想必各位讀者都有這個疑問,全世界橫跨時區最大的幾個國家中,比如俄羅斯,美國,加拿大以及中國,前三者都實行了時區制,唯有中國沒有區分時區,全國一個時區,即東八區!我們來看看這些實行了時區的國家是怎麼區隔時區的?中國又為什麼不區分時區?
  • 怎麼理解php中的數組?php的數組創建和使用方法是什麼?
    php數組的定義數組就是值類型相同的變量的集合,在PHP中的一種常用的複合數據類型,數據可以存放很多的數據,可以存儲任何類型的數據。我們可以把變量當做一個包含值得盒子,那麼可以把數組當做當成一個帶有隔層的盒子,每一層都可以存放一個值。
  • 臺灣5000人聯署要求把中國時區改為日本時區,結果被臺灣網友罵翻了
    《自由時報》稱,改了時區,以後去日本就不用改時差了 。「風傳媒」網站19日稱,將「時區加快1小時」連署行動是「脫離中國、向日、韓看齊」。臺灣 《聯合報》感慨「去中國化」到了「連時間都瘋狂」的地步。對島內一些人的改時區鬧劇,總部在美國的一家華文媒體評論稱之「臺獨又出奇葩事」。
  • 時區劃分及區時計算
    (2)以本初子午線為基準,從7.5度W至7.5度E,劃分為一個時區,稱為中時區(零時區)。在中時區以東,依次劃分為東一區至東十二區;在中時區以西,依次劃分為西一區至西十二區。(3)東十二區和西十二區各跨7.5個經度,成為東西十二區。
  • 每日一圖【時區環】
    時區與區時(1)時區的劃分 在國際交往中,使用地方時很不方便。為了統一時間,國際規定,每隔15°劃為一個時區,以本初子午線為基準,從西經7.5°至東經7.5°,作為中時區,或叫零時區;中時區以東,依次劃分為東一區至東十二區;中時區以西,依次劃分為西一區至西十二區。東十二區和西十二區各跨經度7.5°合為一個時區(即東西十二區)。全球分為24個時區(如圖)。
  • 地理小常識:時區的計算
    那你知道為什麼地球上有這麼多時間?他們是怎麼定義的?地球上共有360度經度,按照15度一個時區,將全球分為24個時區。以0度經線開始計算,往東方向,依次分為東一區、東二區、東三區.......東十二區;往西方向,依次為西一區、西二區、西三區.....西十二區。其中西十二區和東十二區共佔一個時區,以180度經線為界。如下圖。
  • 關於海外眾籌,你不知道的那點事
    關於海外眾籌的那點事,已經說的不少了。這背後,還有哪些不能說的秘密呢?我找 Crazybaby 團隊聊了下,他們公司的磁懸浮智能藍牙音箱Mars最近在 Indiegogo 上眾籌了 61 萬美元,在 Indiegogo 全球所有項目金額排名第 47 位。來,一起看下海外眾籌你還不知道的那點事。
  • Java中如何顯示不同時區的時間(原理詳解)
    中國使用北京時間,處於東 8 區,相應就是早上 8 點。因此在中國這邊,時間出錯了,就經常會顯示成 1970年1月1日 08:00。 System.out.println(new Date(0)); //Thu Jan 01 08:00:00 CST 1970 當我們在Java代碼中使用new Date(0)來創建時間的時候,得到的結果就是Thu Jan 01 08:00:00 CST 1970,既1970年1月1日 上午08點整。
  • 張北海:時區和時差
    英漢大詞典jet lag的中譯是「噴氣飛行時差綜合症」。你聽過有誰如此形容因時差引起的身心之苦?還不是把這個解釋簡化,一句「我有時差」,就打發了。我去年秋天跑了一趟北京、上海、太原、五臺、香港和臺北,那幾個城市都在同一時區,跑來跑去,都沒有出現什麼「噴氣飛行時差綜合症」。是從臺北飛回紐約之後,才再次感受時差造成的身心之苦。
  • 工欲善其事必先利其器,盤點Github上那些優秀的PHP項目
    工欲善其事必先利其器,作為一個開發者,了解並使用前人造好的輪子能讓我們的開發事半功倍,在這裡老宅整理了幾個Github上有趣的php項目與大家分享。swoole Github倉庫名稱:swoole/swoole-src
  • 我們為什麼不在同一個時區
    無論如何,時區決定了無論我們在地球上的哪個地方,所使用的時鐘都必須與太陽時保持一致,當你穿越多個時區或與遠在他鄉的人交流時,時間的不同真的會讓人感到痛苦。奇怪的是,時區的發明是為了減少混亂,而不是引起混亂,因為太陽時會隨著你在地球上從一個地方到另一個地方的移動而變化,即使是很短的距離,在人類的大部分歷史中,一天的時間在不同地方都存在差異,即使在14世紀歐洲人開始使用機械鐘之後,這種不一致性依然存在。
  • 如何在Windows 10中設置多時區時鐘
    當你需要與全球各地的人協同工作,與處於全球不同時區的家人或朋友打交到時,Windows 系統中的多時區時鐘功能便會派上用場。
  • 世界上的時區是怎樣劃分的?
    今天地球人都知道地球是圓的,每天不同的地方是看到太陽的時間也是不一樣的,這樣對時間的規定也不是一樣的,特別是去全球其它地方商務或旅行,時間問題就顯得重要了,那世界各國的時間是如何劃分的?俄羅斯時區劃分再說說美國,美國的領土也是經度跨度較多,美國本土,包含夏威夷和阿拉斯加,總共有六個時區。如下圖所示,從左至右它們分別是:美國東部時區 EST,美國中部時區 CST,美國山區時區 MST,美國太平洋時區 PST,以及阿拉斯加和夏威夷也分別擁有各自的時間標準。
  • 【今日常識】時區
    一、時區的概念:時區是地球上的區域使用同一個時間定義。1884年在華盛頓召開國際經度會議時,為了克服時間上的混亂,規定將全球劃分為24個時區。二、時區的劃分:地球是自西向東自轉,東邊比西邊先看到太陽,東邊的時間也比西邊的早。