1只酥、時(shí)區(qū)背景
1.1娃胆、為什么有時(shí)區(qū):
世界上不同的地區(qū)有不同的時(shí)間,這是因?yàn)榈厍蚴且粋€(gè)球體等曼,它的自轉(zhuǎn)速度是不同的里烦,所以當(dāng)太陽從一個(gè)地區(qū)升起時(shí)凿蒜,它在其他地區(qū)仍然是黑夜。為了解決這個(gè)問題胁黑,我們把地球分成了24個(gè)時(shí)區(qū)废封,每個(gè)時(shí)區(qū)都有一個(gè)標(biāo)準(zhǔn)時(shí)間。這樣丧蘸,當(dāng)太陽從一個(gè)地區(qū)升起時(shí)漂洋,我們可以根據(jù)這個(gè)地區(qū)的時(shí)區(qū)來確定其他地區(qū)的時(shí)間。
實(shí)際上力喷,常常1個(gè)國家或1個(gè)省份同時(shí)跨著2個(gè)或更多時(shí)區(qū)刽漂,為了照顧到行政上的方便,常將1個(gè)國家或1個(gè)省份劃在一起弟孟。所以時(shí)區(qū)并不嚴(yán)格按南北直線來劃分贝咙,而是按自然條件來劃分。例如拂募,中國幅員寬廣庭猩,差不多跨5個(gè)時(shí)區(qū),但為了使用方便簡(jiǎn)單陈症,實(shí)際上在只用東八時(shí)區(qū)的標(biāo)準(zhǔn)時(shí)即北京時(shí)間為準(zhǔn)(GMT+8)蔼水。
1.2、時(shí)區(qū)劃分方法:
地球是自西向東自轉(zhuǎn)录肯,東邊比西邊先看到太陽趴腋,東邊的時(shí)間也比西邊的早。東邊時(shí)刻與西邊時(shí)刻的差值不僅要以時(shí)計(jì)嘁信,而且還要以分和秒來計(jì)算于样,這給人們帶來不便。
為了克服時(shí)間上的混亂潘靖,1884年在華盛頓召開的一次國際經(jīng)度會(huì)議(又稱國際子午線會(huì)議)上穿剖,規(guī)定將全球劃分為24個(gè)時(shí)區(qū)(東、西各12個(gè)時(shí)區(qū))卦溢。規(guī)定英國(格林尼治天文臺(tái)舊址)為中時(shí)區(qū)(零時(shí)區(qū))糊余、東1—12區(qū),西1—12區(qū)单寂。每個(gè)時(shí)區(qū)橫跨經(jīng)度15度贬芥,時(shí)間正好是1小時(shí)。最后的東宣决、西第12區(qū)各跨經(jīng)度7.5度蘸劈,以東、西經(jīng)180度為界尊沸。每個(gè)時(shí)區(qū)的中央經(jīng)線上的時(shí)間就是這個(gè)時(shí)區(qū)內(nèi)統(tǒng)一采用的時(shí)間威沫,稱為區(qū)時(shí)贤惯,相鄰兩個(gè)時(shí)區(qū)的時(shí)間相差1小時(shí)。
例如棒掠,中國東8區(qū)的時(shí)間總比泰國東7區(qū)的時(shí)間早1小時(shí)孵构,而比日本東9區(qū)的時(shí)間晚1小時(shí)。因此烟很,出國旅行的人颈墅,必須隨時(shí)調(diào)整自己的手表,才能和當(dāng)?shù)貢r(shí)間相一致雾袱。凡向西走恤筛,每過一個(gè)時(shí)區(qū),就要把表撥慢1小時(shí)(比如2點(diǎn)撥到1點(diǎn))谜酒;凡向東走叹俏,每過一個(gè)時(shí)區(qū),就要把表撥快1小時(shí)(比如1點(diǎn)撥到2點(diǎn))僻族。并且規(guī)定英國(格林尼治天文臺(tái)舊址)為本初子午線粘驰,即零度經(jīng)線。
2述么、客戶的時(shí)區(qū)問題
2.1蝌数、時(shí)區(qū)問題中的不變量和變量:
不變量:時(shí)間戳,時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起從0開始至現(xiàn)在的總秒數(shù)(1秒=1000ms度秘,每秒加1000)顶伞,這個(gè)時(shí)間戳全球是一致的
變量:不同時(shí)區(qū),時(shí)間戳轉(zhuǎn)換后的顯示的時(shí)間不一樣剑梳,從上面不變量的描述中我們知道時(shí)間戳為0的時(shí)間在格林威治時(shí)區(qū)的顯示和我們北京時(shí)間時(shí)區(qū)的顯示年月日時(shí)分秒上可能存在偏差唆貌,如下圖所示時(shí)間戳一致的情況下北京時(shí)間是2023年11月13日18:42分,在不同時(shí)區(qū)可能是GMT-12:00時(shí)區(qū)的2023年11月12日22點(diǎn)-24點(diǎn)垢乙,也可能是GMT+14:00時(shí)區(qū)的2023年11月14日00:43分锨咙,顯示上可能就是前一天或者后一天(下面截圖僅舉例子用)
2.2、造成此類問題的前提與影響:
(1)前提:APP內(nèi)時(shí)間未與依賴服務(wù)器時(shí)間保持同一時(shí)區(qū)格式追逮,跟隨設(shè)備時(shí)區(qū)變動(dòng)
影響:假如服務(wù)器是北京時(shí)間酪刀,設(shè)備時(shí)區(qū)在美國,手機(jī)時(shí)鐘與APP內(nèi)顯示的時(shí)間一致钮孵,但是服務(wù)器接口返回的非時(shí)間戳字符串年月日時(shí)分秒文本可能差幾個(gè)小時(shí)可能跨天
(2)前提:APP內(nèi)時(shí)間與依賴服務(wù)器時(shí)間保持同一時(shí)區(qū)格式骂倘,不跟隨設(shè)備時(shí)區(qū)變動(dòng)
影響:假如服務(wù)器是北京時(shí)間,設(shè)備時(shí)區(qū)在美國巴席,手機(jī)時(shí)鐘已經(jīng)顯示晚上20點(diǎn)了历涝,但是頁面上的顯示時(shí)間可能還是早上8點(diǎn)
(2)前提:我們項(xiàng)目中后端的考勤日都是按照北京時(shí)間的0-24點(diǎn)劃分的
影響:考勤日北京時(shí)間的0-24點(diǎn)不等于國外客戶的0-24點(diǎn),例如美國的考勤日0-24點(diǎn),相當(dāng)于中國的前一天的中午12點(diǎn)到第二天的中午12點(diǎn)荧库,有可能會(huì)造成打卡班次和打卡記錄的顯示不全诱担,后端的轉(zhuǎn)換改動(dòng)也會(huì)過大
3、我們項(xiàng)目中的處理方式
3.1电爹、之前保持以北京時(shí)間為標(biāo)準(zhǔn)的方式
在我們的項(xiàng)目中我們是以北京時(shí)間為標(biāo)準(zhǔn)的,一般的上班情況是早8-10點(diǎn)晚17-21點(diǎn)左右料睛,如果是在國內(nèi)上班丐箩,使用上是沒有問題的,即使你是跨天班次恤煞,年月日時(shí)分秒都保持一致的屎勘,國人也都能看的明白(除非手動(dòng)改自己手機(jī)設(shè)備時(shí)區(qū),把自己改亂了)居扒,但是隨著我們國外的客戶越來越多概漱,假如我去外國出差了,我打開手機(jī)的打卡頁喜喂,自動(dòng)獲取的時(shí)區(qū)是美國時(shí)區(qū)GMT-5瓤摧,時(shí)鐘顯示凌晨4:22分,中間打卡按鈕顯示17:22分玉吁,我打個(gè)卡后照弥,下班打卡也顯示17:22,這種顯示不一給了國外的客戶一種大大的疑惑感进副,還得咨詢管理員等得知APP顯示的全是北京時(shí)間这揣,正常記得自己的打卡時(shí)間,從北京時(shí)間換算成國外時(shí)間正常打就可以了影斑,維護(hù)了系統(tǒng)和APP的國人顯示邏輯给赞,給國外打卡客戶帶來了轉(zhuǎn)換的麻煩
同時(shí)進(jìn)入打卡記錄頁和我的考勤頁,國外時(shí)區(qū)的客戶也是比較懵逼的矫户,示例可看下面幾個(gè)圖
3.2片迅、目前項(xiàng)目中的處理方式
因?yàn)闀r(shí)間戳的數(shù)值是全球統(tǒng)一的數(shù)值,所以我們后端部分接口采用了返回字段值是時(shí)間戳的形式吏垮,前端和移動(dòng)端上再讀取手機(jī)設(shè)備的時(shí)區(qū)把這個(gè)時(shí)間戳轉(zhuǎn)換為年月日時(shí)分秒的格式顯示障涯,那就會(huì)得到使用者使用手機(jī)設(shè)備時(shí)區(qū)相應(yīng)的絕對(duì)正確的時(shí)間年月日時(shí)分秒顯示,但是以前后端返回的例如“2023-11-13 17:49”等之類字符串文字,因?yàn)槭潜本r(shí)間的時(shí)間格式膳汪,我們前端和移動(dòng)端需要相應(yīng)的把它根據(jù)北京時(shí)間轉(zhuǎn)換成時(shí)間戳再根據(jù)手機(jī)設(shè)備時(shí)區(qū)處理成例如“2023-11-13 04:49”
打卡頁全部轉(zhuǎn)換為了設(shè)備時(shí)區(qū)的相應(yīng)時(shí)間顯示唯蝶,但是打卡記錄頁和我的考勤頁暫時(shí)不能夠全部轉(zhuǎn)換成,因?yàn)榭赡艽嬖诳记谌盏牟幌嗟惹闆r遗嗽,我在2.2(3)中已經(jīng)舉例說過了粘我,我們?cè)诖蚩ㄓ涗涰摰拿總€(gè)打卡記錄上標(biāo)示了是否跨天的顯示,在我的考勤頁,因?yàn)榭记谌掌谌墙涌诜祷卣髯郑膭?dòng)會(huì)較大暫時(shí)也沒有改動(dòng)都弹,所以這個(gè)使用場(chǎng)景不多的我的考勤頁面,在非北京時(shí)區(qū)的手機(jī)設(shè)備時(shí)區(qū)上會(huì)顯示“(GMT+8)”的提示匙姜,實(shí)際效果如下圖
3.3畅厢、兩種方式的對(duì)比
分別從3.1的三張圖與3.2的三張圖進(jìn)行對(duì)比,前端和移動(dòng)端根據(jù)時(shí)區(qū)的變化內(nèi)部進(jìn)行了處理和轉(zhuǎn)換氮昧,減少了用戶的理解門檻同時(shí)兼顧了北京時(shí)間時(shí)區(qū)的客戶框杜,暫時(shí)夠用,但是由于根源北京時(shí)間考勤日的概念袖肥,處理的依舊不完美
4咪辱、總結(jié)
時(shí)區(qū)問題是一個(gè)根據(jù)時(shí)區(qū)變換轉(zhuǎn)換標(biāo)準(zhǔn)和“落地隨俗”的問題,所以經(jīng)常聽到電視等地方說倒時(shí)差這個(gè)行為椎组,所以通過時(shí)間戳進(jìn)行自適應(yīng)轉(zhuǎn)換是一個(gè)比較優(yōu)的解法油狂,后端也應(yīng)該減少類似年月日時(shí)分秒這樣的字符串字段值,而考勤日這個(gè)概念也需要設(shè)置班次的管理員根據(jù)自己?jiǎn)T工所在地區(qū)的時(shí)區(qū)進(jìn)行區(qū)別設(shè)置寸癌,這樣的體驗(yàn)會(huì)好一些