程序中的(de)時(shí)間問題
發表時(shí)間:2020-10-19
發布人(rén):融晨科技
浏覽次數:46
知識的(de)盲區往往會影響到(dào)程序編程。對于(yú)隻有錘子(zǐ)的(de)人(rén)來(lái)說(shuō),所有問題都是(shì)釘子(zǐ)。
緣由:
前不(bù)久,一個(gè)做前端的(de)同事聯系我,他(tā)說(shuō)一個(gè)時(shí)間控件接收到(dào)後端的(de)數據後,顯示時(shí)總是(shì)少了(le/liǎo)8個(gè)小時(shí),他(tā)想用網上(shàng)的(de)個(gè)工具類,對時(shí)間進行加8的(de)運算,以(yǐ)達到(dào)理想效果。
我以(yǐ)前,在(zài)一大(dà)廠裏撸代碼,發現所有跟時(shí)間格式化相關的(de),都會減8操作後,再格式化,而(ér)且注釋說(shuō)明了(le/liǎo):轉成utc時(shí)間(都已經知道(dào)UTC時(shí)間了(le/liǎo),還這(zhè)樣搞)。
計算機的(de)時(shí)間其實是(shì)一個(gè)長整型數,專業一點的(de)術語叫時(shí)間戳,不(bù)同國(guó)家,或者不(bù)同地(dì / de)點,對同一時(shí)間的(de)表示确不(bù)同,我現在(zài)的(de)當前時(shí)間是(shì):10:17,但在(zài)美國(guó)可能是(shì)12點,但時(shí)間戳都是(shì)一樣的(de)。我曾去西藏阿裏,發現手機上(shàng)的(de)時(shí)間我别人(rén)手機相差了(le/liǎo)幾個(gè)小時(shí),原來(lái)是(shì)我設制自動适應時(shí)區。
個(gè)人(rén)pc上(shàng)也(yě)可以(yǐ)手動設置時(shí)區:
Linux系統有一個(gè)專門的(de)文件存儲當前本地(dì / de)化的(de)信息。
有了(le/liǎo)以(yǐ)上(shàng)知識,解決方案就(jiù)有了(le/liǎo)。
1.在(zài)代碼中設置時(shí)區
在(zài)用SimpleDateFormat格式化日期時(shí),用以(yǐ)下構造函數:
public SimpleDateFormat(String pattern, Locale locale)
Locale 代表了(le/liǎo)地(dì / de)域信息.
優點:簡單易用,在(zài)代碼中寫死,不(bù)用管運維怎麽設制環境。
缺點:不(bù)利于(yú)國(guó)際化,要(yào / yāo)重複寫代碼,且以(yǐ)後不(bù)容易改動
2.設置jre運時(shí)環境的(de)時(shí)區
在(zài)啓動jar時(shí),跟 上(shàng)參數 “-Duser.timezone=GMT+8" ,GMT代表的(de)是(shì)格林威冶,加8代表了(le/liǎo)東八區時(shí)間。
優點:方便全局設置,方便國(guó)際化。
缺點:要(yào / yāo)修改tomcat或其它中間件的(de)啓動參數。(這(zhè)算個(gè)屁,改就(jiù)改呗)
3.設置系統時(shí)區
可以(yǐ)修改Linux系統中的(de)區域文件:/etc/timezone
優點:終極解決方案,一改全部改
缺點:終極解決方案,一改全部改,等等,我有個(gè)jar包裏面全部用了(le/liǎo)+8的(de)操作。……
3.根據http協議中自帶的(de)信息設置時(shí)區
http協議标準中,http 請求頭中的(de)Accept-Language 表示語言信息如:
-H "Accept-Language: zh-CN,zh;q=0.9" ^
配置合spring 中的(de)LocalResolve與i8s可以(yǐ)做到(dào)國(guó)際化,(當然也(yě)包括時(shí)間)
優點:實現國(guó)際化,什麽時(shí)候時(shí)區由用戶浏覽器決定。
缺點:實現麻煩
4.docker容器中的(de)方案
docker容器中的(de)時(shí)區信息往往與系統的(de)不(bù)一緻,
方案一: 在(zài)制作鏡像時(shí)替換掉鏡像中的(de)/etc/timezone,
方案二:在(zài)容器編排時(shí)将容器中的(de)/etc/timezone映射成系統的(de)/etc/timezone,
最後:那個(gè)前端問題
我查看了(le/liǎo)那個(gè)日期控件的(de)文檔,發現有設置區域信息的(de)地(dì / de)方,解決!
我面試過很多人(rén),也(yě)被很多人(rén)面試過,現在(zài)做java似乎都偏向于(yú)高層,網上(shàng)動不(bù)動就(jiù)是(shì)掉打阿裏p8級架構師的(de)課程。我真的(de)不(bù)知道(dào)這(zhè)是(shì)好事還是(shì)壞事。高并發,中間件等等,了(le/liǎo)解的(de)人(rén)真的(de)很多,有時(shí)面試時(shí),就(jiù)是(shì)在(zài)背答案,或有時(shí)聊源代碼,但說(shuō)到(dào)怎麽擴展一個(gè)框架,就(jiù)沒有人(rén)知道(dào)了(le/liǎo)。公司裏真的(de)需要(yào / yāo)這(zhè)樣的(de)程序員,或這(zhè)樣的(de)高級架構角色嗎?
如果是(shì)我,我甯可看重這(zhè)些小事。我不(bù)信一行簡單的(de)代碼都寫不(bù)好,一個(gè)簡單的(de)算法都不(bù)知道(dào),一個(gè)jse中的(de)api都用不(bù)好,還有什麽理由說(shuō)那些高級東西呢。