首頁>資訊>

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

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

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

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

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

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

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

UTCCoordinated 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含時區資訊的時間

22
最新評論
  • 3本作者大大最好的一本小說,劇情讓人拍手叫好,連看三遍也不膩
  • 國王丈夫出軌了為何還要挽留?索菲亞王后這一生過得如此的苦澀