关于时间国际化的方案
如果我們需要去做時(shí)間的國(guó)際化,那么肯定存在這樣一種情形,即,在絕對(duì)時(shí)間同一時(shí)刻, 但這個(gè)時(shí)刻在數(shù)據(jù)庫(kù)的存儲(chǔ)的值是同一個(gè)值,在北京和在紐約看到的時(shí)間顯示是不同的。
看過(guò)網(wǎng)上的一些方案,基本認(rèn)為是兩種基本方案,一個(gè)是直接傳輸給前端Long 類(lèi)型的時(shí)間戳,再由客戶(hù)端獲取當(dāng)?shù)氐臅r(shí)區(qū)來(lái)進(jìn)行時(shí)間的顯示。另一種則是傳輸給前端一個(gè)UTC Epoch,類(lèi)似于這樣的字符串-- "gmtModified":"2021-08-20T09:57:16.000+0000"。表示的是某一個(gè)時(shí)區(qū)的時(shí)刻,如上面這個(gè)字符串,就是表示零時(shí)區(qū)21年08月20號(hào)上午09時(shí)57分16秒。
我的意見(jiàn)更加偏向于后者,主要是考慮到Long類(lèi)型的時(shí)間戳存在以下一些問(wèn)題。
1.如果需要對(duì)時(shí)間進(jìn)行基本的運(yùn)算,如加減一個(gè)月,或者7天,Long類(lèi)型的運(yùn)算多是數(shù)學(xué)的加減法,代碼可讀性低,也容易產(chǎn)生錯(cuò)誤。如果將時(shí)間戳換算成時(shí)間對(duì)象去計(jì)算的話,就產(chǎn)生了轉(zhuǎn)換的成本,而這個(gè)成本是可以避免的。
2.調(diào)試時(shí),光看時(shí)間戳,開(kāi)發(fā)人員不會(huì)產(chǎn)生時(shí)間的認(rèn)識(shí),在開(kāi)發(fā)人員眼中,兩個(gè)不同的時(shí)間戳的數(shù)字,只是代表了兩個(gè)不同的時(shí)刻,減少了相對(duì)時(shí)間的認(rèn)識(shí)。例如,相差多少時(shí)間,這兩個(gè)時(shí)間戳分別表示的是什么時(shí)候。
較為完整的解決方案:
Mysql 數(shù)據(jù)庫(kù)之中存儲(chǔ)的時(shí)間都是零時(shí)區(qū)的時(shí)間,因?yàn)橐WC服務(wù)端的時(shí)間格式一致性。現(xiàn)在每一個(gè)mysql的連接,即我們的服務(wù)對(duì)mysql的連接,對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō),仍屬于服務(wù)端的范疇,但是對(duì)于mysql而言,我們的服務(wù)是mysql的客戶(hù)端,所以我們的服務(wù)的每一個(gè)數(shù)據(jù)連接都需要顯示的設(shè)置時(shí)區(qū)參數(shù)。我們目前用的就是東八區(qū),所以,時(shí)間在我們服務(wù)端的流轉(zhuǎn)也統(tǒng)一使用東八區(qū)為宜。
時(shí)區(qū)的轉(zhuǎn)換一般發(fā)生在序列化和反序列化的時(shí)候發(fā)生,目前來(lái)說(shuō),只要保證每次序列化和反序列化都按東八區(qū)來(lái)進(jìn)行就不會(huì)有問(wèn)題,即需要保證各個(gè)服務(wù)的時(shí)區(qū)一致性。
傳輸給前端的VO需要改變一下序列化策略,應(yīng)該采用UTC epoch的格式給前端。跟目前的服務(wù)端的傳輸?shù)臅r(shí)間格式相對(duì)比的話,就是多了一個(gè)時(shí)區(qū)的信息。
當(dāng)然,前端傳輸?shù)臄?shù)據(jù)也應(yīng)該是時(shí)間戳或者UTC epoch。
存在的一些問(wèn)題:
上面的方案也不是完整的,存在一個(gè)問(wèn)題。即服務(wù)端各個(gè)服務(wù)之間需要遵從同一個(gè)時(shí)區(qū),如果只是時(shí)間的相對(duì)運(yùn)算,例如三天后,8小時(shí)候后,一周之后,這個(gè)不會(huì)有問(wèn)題,因?yàn)槊恳惶於际枪潭ǖ?4小時(shí),每個(gè)小時(shí)都是固定的60分鐘。但是如果是一個(gè)月之后或許會(huì)有不同,或者是當(dāng)月有效亦或者11.11當(dāng)天有效這些判斷條件。原因是因?yàn)榉?wù)端需要保證時(shí)區(qū)的一致性,而如果客戶(hù)端是國(guó)際化的,那么服務(wù)端都以一個(gè)時(shí)區(qū)為準(zhǔn),而客戶(hù)端是多時(shí)區(qū)的。在北京的11.11號(hào),和紐約的11.11號(hào)是不同的。
在這種情形之下,服務(wù)端如果進(jìn)行時(shí)間的計(jì)算應(yīng)該僅限于固定時(shí)間的偏移,例如,10s之后,10分鐘之后,10小時(shí)之后,10天之后。而也會(huì)有一些特殊的情況,具體的情形有,年費(fèi)的會(huì)員,怎么計(jì)算過(guò)期的問(wèn)題,我看過(guò)一種方案,一種是直接取對(duì)客戶(hù)有利的值,即366天,計(jì)算的時(shí)候在開(kāi)始的時(shí)間戳上加上366天就可以了。
另外一種情況是雙十一,這種屬于浮動(dòng)時(shí)間,我覺(jué)得應(yīng)該以服務(wù)端的時(shí)區(qū)為準(zhǔn),因?yàn)橛?jì)算發(fā)生在服務(wù)端之上。即活動(dòng)通知時(shí),就應(yīng)注明活動(dòng)時(shí)間為北京時(shí)間11月11號(hào),黑色星期五則應(yīng)以紐約時(shí)間黑色星期五為準(zhǔn)。
總結(jié)
以上是生活随笔為你收集整理的关于时间国际化的方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SAP CRM产品主数据工作流相关调试
- 下一篇: c++之虚基类初始化