摘要:微信公眾號后端進(jìn)階,專注后端技術(shù)分享框架分布式中間件服務(wù)治理等等。
微信公眾號「后端進(jìn)階」,專注后端技術(shù)分享:Java、Golang、WEB框架、分布式中間件、服務(wù)治理等等。
老司機(jī)傾囊相授,帶你一路進(jìn)階,來不及解釋了快上車!
我發(fā)現(xiàn)數(shù)據(jù)庫有些日期居然用字符串保存?于是跟幾個(gè)小伙伴討論了關(guān)于數(shù)據(jù)庫的日期應(yīng)該要怎么保存的問題,其實(shí)我一直都建議直接用數(shù)值保存時(shí)間戳,為什么我要這么建議呢?
以下,我會從時(shí)區(qū)的概念來跟你們解釋一下,為什么用數(shù)值保存時(shí)間戳是最好的方案,同時(shí)也為了分享出來,讓更多開發(fā)小伙伴留意這些細(xì)節(jié)性的東西。
相信時(shí)區(qū)對于很多人來說的很熟悉,因?yàn)榈厍蚴菆A的,在地球上不同角落看到的太陽上升的角度都是不同的,即每個(gè)人對于時(shí)間的顯示都是不一樣的,
舉個(gè)例子:
此時(shí)處于東 8 區(qū)的我們北京時(shí)間是 10 點(diǎn),那么處于東 1 區(qū)的時(shí)間就是 3 點(diǎn),但是他們的時(shí)間是等價(jià)的:
"2019-06-20 10:00 +8:00" = "2019-06-20 3:00 +1:00"
所以說,對于不同時(shí)區(qū)的人來說,顯示的時(shí)間是不一樣的,那么此時(shí)你是如何將將時(shí)間保存到數(shù)據(jù)中的呢?
我姑且假設(shè)你用的是 new Date() 方法來保存當(dāng)時(shí)日期,但據(jù)我所知道的,數(shù)據(jù)庫的 DateTime 類型是沒有時(shí)區(qū)信息的,如果你此時(shí)用 DateTime 格式保存日期,就會丟失時(shí)區(qū)信息,如果你的服務(wù)器更該地址,從數(shù)據(jù)庫讀出來的日期數(shù)據(jù)就是錯(cuò)誤的!
可能你會說,那我用 timeStamp 類型保存總不會丟失時(shí)區(qū)信息了吧?確實(shí)沒丟失,沒毛病。但是據(jù)我所知道的,timeStamp 保存的時(shí)間最長不能超過 2037 年,而且你要考慮每個(gè)數(shù)據(jù)的 timeStamp 類型都有可能不一樣。
至于用字符串來存儲時(shí)間,就更加不推薦了,姑且不從時(shí)區(qū)來說,你比較日期大小也是個(gè)問題,我舉個(gè)例子:
to_char(SYSDATE, "yyyy-MM-dd") > START_TIME
要比較一個(gè)時(shí)間大小,我需要這么做,還需要將系統(tǒng)時(shí)間轉(zhuǎn)成字符串來給你對比,而且在轉(zhuǎn)換成字符串比較時(shí),數(shù)據(jù)庫內(nèi)部也會將其轉(zhuǎn)換成時(shí)間來比較,你覺得這種查詢條件會好到哪里去?
我們也知道在 JDK8 中新的時(shí)間 API LocalDateTime 中,有著豐富的時(shí)區(qū)轉(zhuǎn)換的方法可用,但即便你說你精通 LocalDateTime 的各種花式用法,你也不得不面對繁雜的轉(zhuǎn)換。
所以,我們需要一個(gè)擁有「絕對是時(shí)間」,來幫助我們記錄日期,幫我們節(jié)省下轉(zhuǎn)換的時(shí)間,這個(gè)「絕對時(shí)間」就是時(shí)間戳,時(shí)間戳的定義是從一個(gè)基準(zhǔn)時(shí)間開始算起,這個(gè)基準(zhǔn)時(shí)間是「1970-1-1 00:00:00 +0:00」,從這個(gè)時(shí)間開始,用整數(shù)表示,以秒計(jì)時(shí),隨著時(shí)間的流逝這個(gè)時(shí)間整數(shù)不斷增加。這樣一來,我只需要一個(gè)數(shù)值,就可以完美地表示時(shí)間了,而且這個(gè)數(shù)值是一個(gè)絕對數(shù)值,即無論的身處地球的任何角落,這個(gè)表示時(shí)間的時(shí)間戳,都是一樣的,生成的數(shù)值都是一樣的,并且沒有時(shí)區(qū)的概念,所以在系統(tǒng)的中時(shí)間的傳輸中,都不需要進(jìn)行額外的轉(zhuǎn)換了,只有在顯示給用戶的時(shí)候,才轉(zhuǎn)換為字符串格式的本地時(shí)間。
而且很重要的一點(diǎn)就是,在現(xiàn)有的編程語言中,都提供了方法來獲取時(shí)間戳,這對于我們不同語言的項(xiàng)目交互來說,不要太方便!所以在這里我強(qiáng)烈建議前后端關(guān)于時(shí)間的交互,都用時(shí)間戳來交互。
這時(shí),可能有同學(xué)又來杠一波,你用一個(gè)出數(shù)值來表示時(shí)間,我查數(shù)據(jù)庫時(shí),以我的眼力和口算,根本不知道時(shí)間是多少,我覺得這個(gè)根本不需要擔(dān)心啊,你查數(shù)據(jù)庫無非是查看需要的數(shù)據(jù)而已,你在 sql 里面對時(shí)間戳個(gè)時(shí)間轉(zhuǎn)換函數(shù)就好了,比如:
from_unixtime(1561053690000)
如果你還要繼續(xù)杠,說我就是要在數(shù)據(jù)庫表中看到時(shí)間,我覺得如果你要這樣,為什么還需要前端,直接拿數(shù)據(jù)庫當(dāng)前端展示就好了。
我總結(jié)一下數(shù)據(jù)庫用數(shù)值保存時(shí)間戳的諸多好處:
在數(shù)據(jù)庫中日期比較不要太方便,小學(xué)一年級就會的數(shù)學(xué)題,而且性能好;
數(shù)值對于任何系統(tǒng)交互來說都不存在障礙;
基于絕對時(shí)間的數(shù)值存儲,不存在時(shí)區(qū)問題;
在交互過程中,摒棄沒必要的重重轉(zhuǎn)換,一個(gè)數(shù)字走天下,用戶需要顯示,前端只需要拿到時(shí)間戳顯示正確的本地時(shí)間;
解決了由于各個(gè)數(shù)據(jù)庫對于時(shí)間實(shí)現(xiàn)的不一樣導(dǎo)致的問題,比如說 Mysql 的時(shí)間函數(shù)跟 Oracle 會有一些差別,假如你現(xiàn)在的 sql 有時(shí)間函數(shù),換了數(shù)據(jù)庫很可能就會出錯(cuò)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77894.html
摘要:想象著你們給我拼命點(diǎn)贊的樣子,是多么的滑稽,我笑了笑,哎,程序員的快樂,往往就這么樸實(shí)無華,且枯燥。哎,程序員的快樂,往往就這么樸實(shí)無華,且枯燥。想象著,我很快就能掌控這系統(tǒng)了,我笑了笑。經(jīng)過我多層,一個(gè)功能就這么實(shí)現(xiàn)了。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 我是一個(gè)程序員,...
摘要:結(jié)了賬,大盤雞居然沒吃完,打了包,開始搖搖晃晃的吹著晚風(fēng),邊消化食兒邊散步回家。工作已完成為目的,而非成果。有的父母離得遠(yuǎn)溝通的少,即使是觀念不同,也可以不予理會。 showImg(https://segmentfault.com/img/bV1Dqu?w=3500&h=2079); 晚上,上完了線上課,忽然想起來還沒吃飯,隨手拿起桌子上的葡萄放在嘴里,邊尋思著晚飯吃什么,邊去洗臉讓驅(qū)...
摘要:結(jié)了賬,大盤雞居然沒吃完,打了包,開始搖搖晃晃的吹著晚風(fēng),邊消化食兒邊散步回家。工作已完成為目的,而非成果。有的父母離得遠(yuǎn)溝通的少,即使是觀念不同,也可以不予理會。 showImg(https://segmentfault.com/img/bV1Dqu?w=3500&h=2079); 晚上,上完了線上課,忽然想起來還沒吃飯,隨手拿起桌子上的葡萄放在嘴里,邊尋思著晚飯吃什么,邊去洗臉讓驅(qū)...
摘要:工作已完成為目的,而非成果。個(gè)不符合自己內(nèi)心的理想工作。上了樓,直接微信視頻,確定了他在電腦前之后,我開始讓他按照我的思路走寫出你覺得這份工作的不足之處。 showImg(https://segmentfault.com/img/bV1DpL?w=3500&h=1405); 晚上,上完了線上課,忽然想起來還沒吃飯,隨手拿起桌子上的葡萄放在嘴里,邊尋思著晚飯吃什么,邊去洗臉讓驅(qū)除一下上課...
閱讀 1535·2023-04-26 02:08
閱讀 3128·2021-10-14 09:42
閱讀 7177·2021-09-22 15:34
閱讀 3236·2019-08-30 13:16
閱讀 2718·2019-08-26 13:49
閱讀 1342·2019-08-26 11:59
閱讀 1251·2019-08-26 10:31
閱讀 2170·2019-08-23 17:19