AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

系統(tǒng)設(shè)計(jì)中跨時(shí)區(qū)問題 解決方案

來源: 責(zé)編: 時(shí)間:2024-04-29 09:03:24 140觀看
導(dǎo)讀一、背景假如開發(fā)一套統(tǒng)一的系統(tǒng)產(chǎn)品,供遍布全球的所有分公司使用。產(chǎn)品功能設(shè)計(jì)中,經(jīng)常會遇到一場活動,分跨不同時(shí)區(qū),系統(tǒng)需要顯示不同時(shí)區(qū)的時(shí)間,同時(shí)希望跨時(shí)區(qū)的用戶可以同一時(shí)間開始,同一時(shí)間結(jié)束。對于類似跨時(shí)區(qū)處理

一、背景

假如開發(fā)一套統(tǒng)一的系統(tǒng)產(chǎn)品,供遍布全球的所有分公司使用。srG28資訊網(wǎng)——每日最新資訊28at.com

產(chǎn)品功能設(shè)計(jì)中,經(jīng)常會遇到一場活動,分跨不同時(shí)區(qū),系統(tǒng)需要顯示不同時(shí)區(qū)的時(shí)間,同時(shí)希望跨時(shí)區(qū)的用戶可以同一時(shí)間開始,同一時(shí)間結(jié)束。srG28資訊網(wǎng)——每日最新資訊28at.com

對于類似跨時(shí)區(qū)處理問題,那我們該如何設(shè)計(jì)實(shí)現(xiàn)呢?srG28資訊網(wǎng)——每日最新資訊28at.com

圖片srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

二、幾個重要概念

  • 時(shí)區(qū)

    劃分時(shí)區(qū)是為了便于人們進(jìn)行跨地區(qū)的交流、協(xié)作和管理。srG28資訊網(wǎng)——每日最新資訊28at.com

    時(shí)區(qū)的劃分以地球表面按經(jīng)線從東到西劃成一個個區(qū)域,每隔經(jīng)度15°劃分一個時(shí)區(qū),規(guī)定相鄰區(qū)域的時(shí)間相差1小時(shí),如下圖所示:srG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片srG28資訊網(wǎng)——每日最新資訊28at.com

  • 格林尼治時(shí)間

    英國皇家格林尼治天文臺,UTC/GMT 0 (零時(shí)區(qū))。srG28資訊網(wǎng)——每日最新資訊28at.com

  • 中國時(shí)區(qū)

    有東五區(qū)、東六區(qū)、東七區(qū)、東八區(qū)、東九區(qū),新疆在東五、東六、而東北在東九區(qū),但解放后我們國家統(tǒng)一采用北京時(shí)間(東八區(qū))為準(zhǔn)。srG28資訊網(wǎng)——每日最新資訊28at.com

  • UTC

    Coordinated Universal Time,世界統(tǒng)一時(shí)間,中國是UTC+8。srG28資訊網(wǎng)——每日最新資訊28at.com

  • GMT

    Greenwish Mean Time,以地球公轉(zhuǎn)和自轉(zhuǎn)來計(jì)算時(shí)間,而UTC以原子鐘來計(jì)算時(shí)間。srG28資訊網(wǎng)——每日最新資訊28at.com

  • UNIX時(shí)間戳

    1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),因此,不同的時(shí)區(qū)的時(shí)間戳是相同的。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

三、操作系統(tǒng)、數(shù)據(jù)庫時(shí)區(qū)設(shè)置

3.1 Linux 中設(shè)置時(shí)區(qū)

一臺Linux服務(wù)器有兩個時(shí)間源,一個是硬件時(shí)間,即服務(wù)器硬件CMOS維護(hù)的時(shí)間,還有一個是軟件時(shí)間,即操作系統(tǒng)維護(hù)的時(shí)間,前者通過hwclock命令來訪問,后者則主要通過date命令來訪問。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

date是最常用的時(shí)間相關(guān)的命令,例如:srG28資訊網(wǎng)——每日最新資訊28at.com

# 獲取當(dāng)前時(shí)間$ dateFri Apr 26 15:22:16 CST 2024# 以特定格式輸出當(dāng)前時(shí)間,格式字符串前以"+"開頭,例如獲得當(dāng)前時(shí)間的epoch$ date +%s1714117833# 設(shè)置當(dāng)前時(shí)間$ sudo date -s "2024-04-25 00:00:00"Thu Apr 25 00:00:00 CST 2024

如果是云服務(wù)器的話,中國區(qū)服務(wù)器默認(rèn)都是UTC+8,海外機(jī)器則是UTC+0,關(guān)于這個大家再需要確認(rèn)一下。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

Linux 使用 tzselect 調(diào)整時(shí)區(qū)

該命令會向?qū)降倪x擇洲區(qū)、國家和城市,然后在/usr/share/zoneinfo下會生成時(shí)區(qū)的文件,將該文件覆蓋/etc/localtime即可完成時(shí)區(qū)設(shè)置。srG28資訊網(wǎng)——每日最新資訊28at.com

#設(shè)置時(shí)區(qū)tzselect

srG28資訊網(wǎng)——每日最新資訊28at.com

3.2 MySQL 中設(shè)置時(shí)區(qū)

先登錄到mysql 安裝所在的機(jī)器。srG28資訊網(wǎng)——每日最新資訊28at.com

-- 看下當(dāng)前的mysql時(shí)區(qū)設(shè)置show variables like "%time_zone%";

下圖顯示 SYSTEM,表示用的默認(rèn)時(shí)區(qū)。srG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片srG28資訊網(wǎng)——每日最新資訊28at.com

我們可以修改成 +8 的北京所在時(shí)區(qū),操作如下:srG28資訊網(wǎng)——每日最新資訊28at.com

set global time_zone = '+8:00'; set time_zone = '+8:00';

srG28資訊網(wǎng)——每日最新資訊28at.com

如上修改,MySQL如果重啟后,又會恢復(fù)之前的設(shè)置。srG28資訊網(wǎng)——每日最新資訊28at.com

下面介紹一種設(shè)置,讓重啟永久生效的方案:修改設(shè)置,重啟永久生效。srG28資訊網(wǎng)——每日最新資訊28at.com

修改配置文件 /etc/my.cnfsrG28資訊網(wǎng)——每日最新資訊28at.com

[mysqld]default-time_zone = '+8:00'

重啟 MySQL 生效srG28資訊網(wǎng)——每日最新資訊28at.com

systemctl stop mysqld.servicesystemctl start mysqld.service

srG28資訊網(wǎng)——每日最新資訊28at.com

四、系統(tǒng)跨時(shí)區(qū)設(shè)計(jì)

現(xiàn)在我們回到正規(guī),談?wù)勅绾谓鉀Q上面開篇提出的問題。srG28資訊網(wǎng)——每日最新資訊28at.com

4.1 服務(wù)端中的時(shí)間處理

既然時(shí)區(qū)的處理不能在客戶端做,換言之就必須在服務(wù)端實(shí)現(xiàn)。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

這樣就需要解決兩個問題:時(shí)間的保存和獲取。srG28資訊網(wǎng)——每日最新資訊28at.com

客戶端傳來的時(shí)間為客戶端所在時(shí)區(qū)的當(dāng)?shù)貢r(shí)間,服務(wù)端接收到客戶端發(fā)送的時(shí)間后,需要基于客戶端相應(yīng)時(shí)區(qū)轉(zhuǎn)換成UTC時(shí)間才能保存到數(shù)據(jù)庫。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

所有后端暴露的接口中的時(shí)間對象,全部以 UTC 時(shí)間表示。srG28資訊網(wǎng)——每日最新資訊28at.com

同時(shí),所有后端在存儲、計(jì)算、傳輸時(shí)間時(shí),也統(tǒng)一使用 UTC 時(shí)間。由于 DB 存儲時(shí)間時(shí),時(shí)區(qū)信息會被丟掉,因此應(yīng)保證丟掉的時(shí)區(qū),是大家明確約定清楚的無歧義的,即 UTC。這樣一來,數(shù)據(jù)庫中的所有時(shí)間字段也都沒有歧義。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

4.2 前端中的時(shí)間

時(shí)間在前端中的應(yīng)用比較簡單,通常的方案是:后端直接返回 ISO 標(biāo)準(zhǔn)本地時(shí)間,避免 UTC 在前端再次格式化和處理時(shí)區(qū),否則會把問題變得更加復(fù)雜(時(shí)區(qū)設(shè)置只發(fā)生在應(yīng)用服務(wù)器中)。srG28資訊網(wǎng)——每日最新資訊28at.com

如果有需要處理跨時(shí)區(qū)的業(yè)務(wù)場景需,可以讓用戶選擇時(shí)區(qū),并在任何時(shí)候都將處理后的時(shí)區(qū)信息放到時(shí)間字符串中。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片srG28資訊網(wǎng)——每日最新資訊28at.com

前端的時(shí)間格式化比較簡單,可以使用 Day.js 和 Moment.js 等時(shí)間庫來完成。srG28資訊網(wǎng)——每日最新資訊28at.com

正是因?yàn)榍懊嬷v到的時(shí)區(qū)問題,Moment.js 為了處理此問題,使用了一個巨大的 JSON 文件記錄了不同年份之間、不同國家、不同經(jīng)緯度的時(shí)區(qū)信息,另外這些信息還會和語言信息綁定導(dǎo)致文件非常巨大。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

4.3 其它注意事項(xiàng)

在編程中還有一些額外的坑可能需要注意:srG28資訊網(wǎng)——每日最新資訊28at.com

  • 使用環(huán)境變量配置時(shí)區(qū)信息,使用應(yīng)用服務(wù)器來裁決時(shí)區(qū)(沒有特別業(yè)務(wù)說明的情況下),因此確保服務(wù)器配置的時(shí)區(qū)相同。
  • 如果是跨國交易或者數(shù)據(jù)同步的時(shí)候,根據(jù)客戶端連接到的服務(wù)器來決定操作用戶所屬的時(shí)區(qū)。
  • 依賴應(yīng)用服務(wù)器的時(shí)區(qū)信息做時(shí)區(qū)裁決,不要依賴數(shù)據(jù)庫的時(shí)區(qū)設(shè)置,數(shù)據(jù)庫透明存放數(shù)據(jù)即可。
  • 時(shí)區(qū)配置來源有操作系統(tǒng)、環(huán)境變量、數(shù)據(jù)庫時(shí)區(qū)、Java 啟動參數(shù),建議統(tǒng)一使用 Java 啟動參數(shù),避免配置出錯,數(shù)據(jù)庫不要做時(shí)區(qū)自動轉(zhuǎn)換,避免使用 TIMESTAMP 類型。
  • 在高并發(fā)的場景中獲取系統(tǒng)時(shí)間可能有性能問題,原因是 JVM 需要訪問進(jìn)入系統(tǒng)內(nèi)核態(tài)執(zhí)行指令,當(dāng)高并發(fā)且不需要高精度時(shí)間時(shí)可以增加緩存,但需要權(quán)衡處理。
  • 有時(shí)候在處理業(yè)務(wù)時(shí),需要考慮自然月問題,需要特別注意。
  • 關(guān)于時(shí)間同步問題中,還有一個墻上時(shí)鐘和單調(diào)時(shí)鐘的問題。墻上時(shí)鐘是指根據(jù)日歷獲取時(shí)間,會受到時(shí)間校對回?fù)艿膯栴},而單調(diào)時(shí)鐘是指系統(tǒng)啟動后的秒數(shù),它不會回?fù)堋T谑褂?NTP 服務(wù)時(shí),可以配置為 NTPD 模式,通過調(diào)慢時(shí)間頻率避免回?fù)堋?/li>

srG28資訊網(wǎng)——每日最新資訊28at.com

五、補(bǔ)充知識:夏令時(shí)、冬令時(shí)

圖片圖片srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

夏令時(shí)(Daylight Saving Time:DST),也叫夏時(shí)制,又稱“日光節(jié)約時(shí)制”和“夏令時(shí)間”,是一種為節(jié)約能源而人為規(guī)定地方時(shí)間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時(shí)間稱為“夏令時(shí)間”。一般在天亮早的夏季人為將時(shí)間調(diào)快一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。srG28資訊網(wǎng)——每日最新資訊28at.com

夏令時(shí)調(diào)整通常適用于:夏季日照時(shí)間相對較長,日出和日落時(shí)間發(fā)生較大變化的地方。關(guān)于夏令時(shí)的問題,人們褒貶不一。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

有夏令時(shí)就會有冬令時(shí),冬令時(shí) 通常是指當(dāng)?shù)厥褂玫臉?biāo)準(zhǔn)時(shí)間。在使用夏令時(shí) - 日光節(jié)約時(shí)制(Daylight Saving Time) 的地區(qū),夏天時(shí)鐘撥快一小時(shí),冬天再撥回標(biāo)準(zhǔn)時(shí)間。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

那為什么我國沒有夏令時(shí)呢?srG28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)不使用夏令時(shí)也能實(shí)現(xiàn)節(jié)約能源、減少照明成本的目的,只不過把調(diào)整人們生活節(jié)奏的權(quán)利給到了具體場景。在學(xué)校,會使用夏季和冬季課表,在工作環(huán)境中,某些公司也會針對下冬夏調(diào)整上班時(shí)間。srG28資訊網(wǎng)——每日最新資訊28at.com

srG28資訊網(wǎng)——每日最新資訊28at.com

六、閱讀更多及參考文獻(xiàn)srG28資訊網(wǎng)——每日最新資訊28at.com

本文參考資料:

  • https://en.wikipedia.org/wiki/Time_zone
  • https://zh.wikipedia.org/wiki/ISO_8601
  • https://www.rfc-editor.org/rfc/rfc3339
  • https://datatracker.ietf.org/doc/html/rfc5545
  • https://en.wikipedia.org/wiki/System_time
  • https://www.iplocate.com/
  • https://en.wikipedia.org/wiki/Timestamp

本文鏈接:http://www.tebozhan.com/showinfo-26-86339-0.html系統(tǒng)設(shè)計(jì)中跨時(shí)區(qū)問題 解決方案

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 大模型下B端前端代碼輔助生成的思考與實(shí)踐

下一篇: Python 教你三分鐘用Bert搭建問答搜索引擎

標(biāo)簽:
  • 熱門焦點(diǎn)
Top