聽乾貨君聊項目多時區處理

2021-01-10 51CTO
聽乾貨君聊項目多時區處理

很多時候在項目的開發中或許沒有接觸過多時區,項目大多是部署國內,同時僅僅為國內用戶提供服務,一旦當用戶到國外後,項目中的很多時間都變得與當地時間不一樣,對用戶非常不友好。例如近幾年非常火的線上教育,像一些外籍老師,教小朋友學英文,如何保證雙方在特定的時間都進入教室,變得非常常見。

作者:佚名來源:今日頭條|2020-12-17 08:00

 為什麼要講一下這個問題呢?

很多時候在項目的開發中或許沒有接觸過多時區,項目大多是部署國內,同時僅僅為國內用戶提供服務,一旦當用戶到國外後,項目中的很多時間都變得與當地時間不一樣,對用戶非常不友好。例如近幾年非常火的線上教育,像一些外籍老師,教小朋友學英文,如何保證雙方在特定的時間都進入教室,變得非常常見。


對於多時區用戶提供服務,業界如何處理時間呢?

在講述業界的處理之前,我們先來了解幾個概念。

時間戳,是指格林尼治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數,用有符號32位整數表示。

GMT:Greenwich Mean Time 格林尼治標準時間。這是以英國格林尼治天文臺觀測結果得出的時間,這是英國格林尼治當地時間,這個地方的當地時間過去被當成世界標準的時間。

UT:Universal Time 世界時。根據原子鐘計算出來的時間。

UTC:Coordinated Universal Time 協調世界時。因為地球自轉越來越慢,每年都會比前一年多出零點幾秒,每隔幾年協調世界時組織都會給世界時+1秒(會出現閏秒即61s,一般不處理),讓基於原子鐘的世界時和基於天文學(人類感知)的格林尼治標準時間相差不至於太大。並將得到的時間稱為UTC,這是現在使用的世界標準時間。

GMT和UTC維度不一樣,但值是一樣的,UTC = GTM+0(時區)

我們都知道時間都可以用GMT或者UTC來表示,而時間戳由於是基於格林尼治的特定時間,在地球上過1秒,在全球任何一個地方都是1秒,因此同一時刻,全球的值是一樣的。

可以看看java示例,發現不同時區時間戳確實是相等的

// 獲得不同時區的時間,來計算時間戳 LocalDateTime localDateTime = LocalDateTime.now(); OffsetDateTime offsetDateTime7 = OffsetDateTime.of(localDateTime.minusHours(1), ZoneOffset.ofHours(7)); OffsetDateTime offsetDateTime8 = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(8)); System.out.println(offsetDateTime7.toEpochSecond() == offsetDateTime8.toEpochSecond()); // true 

因此,業界對於時區的處理基本都是基於時間戳。


前後端配合以保證用戶看到的都是本地時間

針對此類問題,對於後端需要注意的是伺服器是否會部署到不同時區,建議獲取系統時間的操作,改成獲取統一一個時區的時間,再將其轉成時間戳進行存儲;而前端最主要的則是在請求中傳入時區到後端,一般可以在請求頭中添加獲取到的系統的時區,將時區傳入到後端。後端根據時區,如+8,則將資料庫中的時間戳,轉成對應時區的時間。如下圖


最後,推薦使用java8時間類去處理,java8中核心的類就幾種:

ZoneId、ZoneOffset主要表示時區和偏移

Instant 表示時間戳,Duration、Period 表示時間差,前者表示時間差,後者表示日期差

LocalDate、LocalTime、LocalDateTime表示日期、時間、日期+時間

ZonedDateTime、OffsetDateTime含時區信息的時間

【編輯推薦】

【責任編輯:

姜華

TEL:(010)68476606】

點讚 0

相關焦點

  • 中國為什麼只用一個時區?
    於是,對於中美俄這種國土面積龐大、橫跨多個時區的國家,如何制定合適的時區,就是一件麻煩的事情。橫跨九個小時的高考一般來說,一個國家制定時區,都會根據約定,儘可能地制定分區時間,使其適合自己。然而過多時區帶來的混亂和麻煩依然不可避免,為此不得不採取多時區制。
  • 中國為什麼只用一個時區?-虎嗅網
    於是,對於中美俄這種國土面積龐大、橫跨多個時區的國家,如何制定合適的時區,就是一件麻煩的事情。橫跨九個小時的高考一般來說,一個國家制定時區,都會根據約定,儘可能地制定分區時間,使其適合自己。然而過多時區帶來的混亂和麻煩依然不可避免,為此不得不採取多時區制。
  • 如何在Windows 10中設置多時區時鐘
    當你需要與全球各地的人協同工作,與處於全球不同時區的家人或朋友打交到時,Windows 系統中的多時區時鐘功能便會派上用場。
  • Globalization Design: 理解時區
    在處理時區相關問題的時候,我們經常會遇到這樣的縮寫:UTC,GMT,DST,CST,BST等等。
  • 幅員遼闊的中國為何只用一個時區?
    中國幅員遼闊,橫跨多時區,而世界上一些國土面積較大的國家,通常根據不同時區而制定時間。那麼,中國為什麼只採用首都北京所在的東八區時間呢?地球的自轉運動產生了太陽東升西落現象,日出為晝、日落為夜。世界各地以晝夜交替現象為基礎確定日期變化和時間推移。然而各地位置不同時間標準不一造成了時間上的混亂。
  • 搞清日期、時間與時區
    夏令時與冬令時 Daylight Saving Time(簡稱 DST)又稱「日光節約時制」和「夏令時間」,是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所採用的統一時間稱為「夏令時間」。一般在天亮早的夏季人為將時間提前一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。。
  • 張北海:時區和時差
    道理誰都知道,這是因為世界各地不同時區( time zones)而出現的時差( time differences)。那時差的科學定義是什麼?至少按照中國現代漢語詞典,是「(天)平太陽時和真太陽時的差」。聽起來有點玄,又好像與人無關。但凡搭乘噴氣飛機十幾個小時穿越好幾個時區的旅客,尤其從西飛向東,卻因之而身心受苦,於是英文出現了一個新的名詞jet lag。但此一名詞卻沒有恰當中譯。
  • 中國橫跨5個時區,為什麼不區分時區?
    想必各位讀者都有這個疑問,全世界橫跨時區最大的幾個國家中,比如俄羅斯,美國,加拿大以及中國,前三者都實行了時區制,唯有中國沒有區分時區,全國一個時區,即東八區!我們來看看這些實行了時區的國家是怎麼區隔時區的?中國又為什麼不區分時區?
  • AL君聊品牌:日產的沉浮路(下)
    在《日產沉浮路(上)//h5.ycapp.yiche.com/share/medianews/19051.html》這篇文章裡,AL君跟大家聊了日產的「第一桶金」,以及日產做出了哪些技術日產的成績,今天咱接著「技術日產」「世界日產」這兩個話題繼續聊。如果你還沒看過《日產沉浮路(上)》,AL君強烈建議先補回上篇再回來看下篇。
  • 不鏽鋼或鈦金屬立體感面盤世界時區手錶有哪些
    兩地時間是公認的實用功能,但上綱到世界時區的話就未必每個人都用得著了,然而很多人買世界時區表未必是出自實用考量,反而單純就是喜歡面盤上整圈的城市名和世界地圖。世界時區表上的地圖不一定都具備機能性,但儘管如此品牌還是樂於在表款中加入這個元素,因為很多人買世界時區就是衝著這點,凡此也再次確認了它的非實用性。
  • 地理小常識:時區的計算
    那你知道為什麼地球上有這麼多時間?他們是怎麼定義的?地球上共有360度經度,按照15度一個時區,將全球分為24個時區。以0度經線開始計算,往東方向,依次分為東一區、東二區、東三區.......東十二區;往西方向,依次為西一區、西二區、西三區.....西十二區。其中西十二區和東十二區共佔一個時區,以180度經線為界。如下圖。
  • 瑞士美度表領航者系列 雙時區防水腕錶型格
    一目了然的雙時區卓越的易讀性使得領航者系列雙時區防水腕錶可以提供高效且實用的讀時體驗。為方便讀取兩個時區的時間,瑞士美度表根據不同功能對錶針進行了區分。除常規時針、分針和秒針之外,還配備了經藍色噴漆處理的24小時時針,通過指向表圈邊緣的24小時刻度來指示第二時區的時間。此外,第二時區刻度的日夜雙色使讀時更為清晰直觀。
  • 世界上的時區是怎樣劃分的?
    俄羅斯時區劃分再說說美國,美國的領土也是經度跨度較多,美國本土,包含夏威夷和阿拉斯加,總共有六個時區。如下圖所示,從左至右它們分別是:美國東部時區 EST,美國中部時區 CST,美國山區時區 MST,美國太平洋時區 PST,以及阿拉斯加和夏威夷也分別擁有各自的時間標準。
  • 【今日常識】時區
    一、時區的概念:時區是地球上的區域使用同一個時間定義。1884年在華盛頓召開國際經度會議時,為了克服時間上的混亂,規定將全球劃分為24個時區。二、時區的劃分:地球是自西向東自轉,東邊比西邊先看到太陽,東邊的時間也比西邊的早。
  • 一口氣看懂「時區」裡的秘密
    ,將世界劃分為24個時區,東12區和西12區。一個國家十次「高考」那麼剛剛說了,每跨15°經度,便是一個時區,比如英國全國都使用零時區,德國全國都使用東一區。但是對於一些幅員遼闊的國家,比如俄羅斯,美國,中國,事情就變得複雜起來。例如俄羅斯,世界上國土面積最大的國家,整整跨越了十一個時區,做個飛機從東邊往西邊飛,落地時間比起飛時間還早。這種情況下,很難採取統一時區,而更多地則是選擇「多時區制」。
  • Java中如何顯示不同時區的時間(原理詳解)
    時區 前面提到了時區,可能很多讀者不知道什麼是時區,先來簡單介紹一下。 時區是地球上的區域使用同一個時間定義。以前,人們通過觀察太陽的位置(時角)決定時間,這就使得不同經度的地方的時間有所不同(地方時)。1863年,首次使用時區的概念。時區通過設立一個區域的標準時間部分地解決了這個問題。
  • 每日一圖【時區環】
    為了統一時間,國際規定,每隔15°劃為一個時區,以本初子午線為基準,從西經7.5°至東經7.5°,作為中時區,或叫零時區;中時區以東,依次劃分為東一區至東十二區;中時區以西,依次劃分為西一區至西十二區。東十二區和西十二區各跨經度7.5°合為一個時區(即東西十二區)。全球分為24個時區(如圖)。
  • 世界時區圖
    為了克服時間上的混亂,1884年在華盛頓召開的一次國際經度會議(又稱國際子午線會議[1] )上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國(格林尼治天文臺舊址)為中時區(零時區)、東1-12區,西1-12區。每個時區橫跨經度15度,時間正好是1小時。最後的東、西第12區各跨經度7.5度,以東、西經180度為界。
  • 你們有過閉著眼聽人說話嗎?網友:說夢話算嗎
    尤其是聽別人說話時,要望著對方的眼睛,表示你此時正在認真聽對方講話。可偏偏有些人喜歡閉著眼睛聽別人說話,這到底是為什麼呢?難道他們不知道要董禮貌的道理嗎?而且面對一個閉著眼睛聽你講話的人,會讓人心裡非常不安,不知道對方是否聽到了你說的話。就像A君遇到的情況一樣。
  • 臺灣5000人聯署要求把中國時區改為日本時區,結果被臺灣網友罵翻了
    「趕脆換去跟美國爸爸同一個時區好了,有自卑到這種程度喔……有什麼毛病嗎?」「臺灣就是在GMT+8 東經120度的在線,是要多管閒事換什麼時區?」「華視」引述島內氣象局天文站主任鄭俊嶽的話稱,以地理位置來說,臺灣時區本來就在GMT+8裡,國際也早就認定。就現實來說,臺灣調整為GMT+9的意義不大,因為臺灣已經很發達,務農族群不多,現代人也不是「日出而作,日落而息」,調整時間意義有限。