成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)間的時(shí)區(qū)問(wèn)題

ispring / 1962人閱讀

摘要:用這個(gè)類(lèi)型還蠻方便的,一個(gè)是有很多內(nèi)置的函數(shù)和來(lái)處理它,比如宏,最關(guān)鍵的是在取數(shù)據(jù)的時(shí)候會(huì)自動(dòng)幫你處理和時(shí)區(qū)的問(wèn)題。至于用存時(shí)間,是另一種可行的方法,參見(jiàn)我個(gè)人不是很喜歡這么做,因?yàn)檫@樣你必須把模型中表示時(shí)間的成員聲明為類(lèi)型。

先說(shuō)一下mysql中DATETIME和TIMESTAMP的區(qū)別

TIMESTAMP是標(biāo)準(zhǔn)的unix timestamp,它存儲(chǔ)的是1970-1-1到現(xiàn)在經(jīng)過(guò)的秒數(shù),4字節(jié)存儲(chǔ)。mysql用這個(gè)類(lèi)型還蠻方便的,一個(gè)是有很多內(nèi)置的函數(shù)和trigger來(lái)處理它,比如CURRENT_TIMESTAMP宏,最關(guān)鍵的是在取數(shù)據(jù)的時(shí)候mysql會(huì)自動(dòng)幫你處理DST和時(shí)區(qū)的問(wèn)題。

DATETIME的范圍更大,好像可以從0000-00-00 00:00:00到9999-12-31 23:59:59,8字節(jié)存儲(chǔ),當(dāng)然mysql內(nèi)部肯定也是用整數(shù)而不是字符串的(說(shuō)了是8字節(jié)了),所以效率不是大問(wèn)題。但DATETIME不帶時(shí)區(qū),比如我在程序里生成了一個(gè)2015-05-07 15:26:00的時(shí)間(實(shí)際上是+8時(shí)區(qū)的,但這個(gè)對(duì)象可能是timezone naive)的,存到mysql里,再?gòu)牟煌瑫r(shí)區(qū)的地方拿出來(lái),這個(gè)時(shí)間可能就混了。

但TIMESTAMP也有兩個(gè)很大的問(wèn)題:

4字節(jié)長(zhǎng)度限制,它只能到2038年

很多時(shí)候我們希望根據(jù)用戶所在地的時(shí)區(qū)顯示時(shí)間而不是光顯示一個(gè)服務(wù)器時(shí)間

所以比較好的做法是,數(shù)據(jù)庫(kù)中使用DATETIME,然后存時(shí)間的時(shí)候一律用程序生成UTC時(shí)間(而不是local時(shí)區(qū)的時(shí)間)存進(jìn)去,取出來(lái)的時(shí)候不管想顯示服務(wù)器時(shí)間還是顯示用戶的時(shí)間都可以處理。

順便提一句,根據(jù)用戶所在地時(shí)區(qū)顯示時(shí)間有兩種做法:

當(dāng)用戶第一次訪問(wèn)網(wǎng)站的時(shí)候,用js獲取時(shí)區(qū)發(fā)送到服務(wù)器上存到session里

用js處理時(shí)間的顯示(我覺(jué)得這種比較方便一點(diǎn),畢竟不用改服務(wù)端代碼)

使用這種做法的唯一缺點(diǎn)是sqlite3沒(méi)有internal的DATETIME類(lèi)型,所以在ORM框架如sqlalchemy中,它會(huì)直接存字符串進(jìn)去。(sqlite3的文檔也說(shuō),你要么存成int要么real要么字符串)。盡管這可能帶來(lái)一些不方便和性能的下降,但我認(rèn)為還是符合“keep it simple and stupid”的原則。

至于用INT存時(shí)間,是另一種可行的方法,參見(jiàn)http://www.liaoxuefeng.com/article/0014132675721847f569c3514034f099477...
我個(gè)人不是很喜歡這么做,因?yàn)檫@樣你必須把模型中表示時(shí)間的成員聲明為int類(lèi)型。這樣是比較不符合邏輯的(那些Date呀Datetime之類(lèi)的類(lèi)就沒(méi)有用了呀,最多就有個(gè)Dateutil就好了),而且會(huì)使得程序不易讀(臥槽這個(gè)publishedDate為什么是int,它到底表示的是時(shí)間嗎?)。總之見(jiàn)仁見(jiàn)智。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17463.html

相關(guān)文章

  • 日期居然用字符串保存?我笑了

    摘要:微信公眾號(hào)后端進(jìn)階,專注后端技術(shù)分享框架分布式中間件服務(wù)治理等等。 微信公眾號(hào)「后端進(jìn)階」,專注后端技術(shù)分享:Java、Golang、WEB框架、分布式中間件、服務(wù)治理等等。 老司機(jī)傾囊相授,帶你一路進(jìn)階,來(lái)不及解釋了快上車(chē)! 我發(fā)現(xiàn)數(shù)據(jù)庫(kù)有些日期居然用字符串保存?于是跟幾個(gè)小伙伴討論了關(guān)于數(shù)據(jù)庫(kù)的日期應(yīng)該要怎么保存的問(wèn)題,其實(shí)我一直都建議直接用數(shù)值保存時(shí)間戳,為什么我要這么建議呢?...

    Leck1e 評(píng)論0 收藏0
  • 國(guó)際版多時(shí)區(qū)設(shè)計(jì)方案

    摘要:用戶場(chǎng)景國(guó)際版中各個(gè)倉(cāng)庫(kù)分屬不同的城市,不同的城市所在時(shí)區(qū)不同,基于各個(gè)角色對(duì)數(shù)據(jù)的使用情況不一樣主要的用戶場(chǎng)景庫(kù)內(nèi)作業(yè)人員,倉(cāng)庫(kù)是紐約倉(cāng),時(shí)區(qū)是,查詢到的倉(cāng)庫(kù)入庫(kù)單。在查詢結(jié)果顯示的時(shí)候,時(shí)間數(shù)據(jù)也需要轉(zhuǎn)換到紐約時(shí)區(qū)。 用戶場(chǎng)景 國(guó)際版中各個(gè)倉(cāng)庫(kù)分屬不同的城市,不同的城市所在時(shí)區(qū)不同,基于各個(gè)角色對(duì)數(shù)據(jù)的使用情況不一樣主要的用戶場(chǎng)景庫(kù)內(nèi)作業(yè)人員,倉(cāng)庫(kù)是紐約倉(cāng),時(shí)區(qū)是UTC-05:00...

    史占廣 評(píng)論0 收藏0
  • 國(guó)際版多時(shí)區(qū)設(shè)計(jì)方案

    摘要:用戶場(chǎng)景國(guó)際版中各個(gè)倉(cāng)庫(kù)分屬不同的城市,不同的城市所在時(shí)區(qū)不同,基于各個(gè)角色對(duì)數(shù)據(jù)的使用情況不一樣主要的用戶場(chǎng)景庫(kù)內(nèi)作業(yè)人員,倉(cāng)庫(kù)是紐約倉(cāng),時(shí)區(qū)是,查詢到的倉(cāng)庫(kù)入庫(kù)單。在查詢結(jié)果顯示的時(shí)候,時(shí)間數(shù)據(jù)也需要轉(zhuǎn)換到紐約時(shí)區(qū)。 用戶場(chǎng)景 國(guó)際版中各個(gè)倉(cāng)庫(kù)分屬不同的城市,不同的城市所在時(shí)區(qū)不同,基于各個(gè)角色對(duì)數(shù)據(jù)的使用情況不一樣主要的用戶場(chǎng)景庫(kù)內(nèi)作業(yè)人員,倉(cāng)庫(kù)是紐約倉(cāng),時(shí)區(qū)是UTC-05:00...

    frank_fun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<