時(shí)間戳的問題
我們的微博應(yīng)用的一個(gè)忽略了很久的問題就是日間和日期的顯示。
直到現(xiàn)在,我們?cè)谖覀兊腢ser和Post對(duì)象中使用Python它自己的方式來渲染時(shí)間對(duì)象,但這并不是一個(gè)好的解決方案。
考慮下這樣的例子。我正在寫這篇文章,此時(shí)正是12月31號(hào)下午3:54。我的時(shí)區(qū)是PST(或者你們更習(xí)慣的:UTC-8)。 在Python解釋器中運(yùn)行,我得到下面輸出:
>>> from datetime import datetime>>> now = datetime.now()>>> print now2012-12-31 15:54:42.915204>>> now = datetime.utcnow()>>> print now2012-12-31 23:55:13.635874
在我所在的地方,now()方法返回了正確的時(shí)間,但是now()調(diào)用返回的時(shí)間是UTC單位。
那么,使用哪個(gè)更好呢?
如果我們用now(),所有數(shù)據(jù)庫(kù)里的時(shí)間戳將會(huì)與服務(wù)器運(yùn)行的當(dāng)?shù)貢r(shí)間一致,這將會(huì)產(chǎn)生一些問題。
比如,如果有一天,我們需要將服務(wù)器放到別的地方(不在一個(gè)時(shí)區(qū)),那么在重啟服務(wù)器之前,數(shù)據(jù)庫(kù)里的時(shí)間都需要更新到與新地點(diǎn)保持一致。
還會(huì)有更為重要的問題。不同時(shí)區(qū)的用戶將會(huì)很難知道什么時(shí)候發(fā)送郵件,如果用戶看到的是PST時(shí)區(qū)的時(shí)間,他們就很難知道郵件是什么時(shí)候發(fā)送的,這就需要用戶根據(jù)這個(gè)時(shí)間做相應(yīng)的調(diào)整。
很顯然這不是一個(gè)好的選擇,這也是我們?yōu)槭裁丛趧?chuàng)建數(shù)據(jù)庫(kù)時(shí)就使用UTC時(shí)區(qū)保存時(shí)間戳。
在標(biāo)準(zhǔn)化時(shí)間戳為UTC時(shí),解決了移動(dòng)服務(wù)器的問題。但是他不能解決第二個(gè)問題,數(shù)據(jù)和時(shí)間在世界上不同地方使用UTC展現(xiàn)給用戶。
假設(shè)一個(gè)用戶在PST時(shí)區(qū)下午3點(diǎn)發(fā)送了一封郵件,這封郵件立刻顯示在他面前,上面寫著11:00pm,或者更具體點(diǎn)(23:00)。
我寫這個(gè)文章的目的也就是讓我們的用戶不再因?yàn)閿?shù)據(jù)和時(shí)間的顯示而困惑。
使用具體的時(shí)間戳
通常的解決方法是,每一個(gè)用戶都從UTC轉(zhuǎn)化到當(dāng)?shù)氐臅r(shí)間。這就需要我們動(dòng)態(tài)變化,從而使數(shù)據(jù)庫(kù)的UTC與之保持一致。
但是我們?cè)趺粗烙脩粼谀哪兀?/p>
許多網(wǎng)站都有一個(gè)設(shè)置頁(yè)面設(shè)置他們的時(shí)區(qū)。這就需要我們添加一個(gè)新的頁(yè)面,并在表單上提供下拉框讓用戶選擇時(shí)區(qū),用戶第一次登錄的時(shí)候需要設(shè)置時(shí)區(qū),并把它作為注冊(cè)的一部分。
這是一個(gè)正常的解決方法,但是這對(duì)于用戶來說有點(diǎn)累贅,用戶需要輸入一條他們已經(jīng)在操作系統(tǒng)中配置過的信息。所以如果我們能抓取到用戶電腦里設(shè)置的時(shí)區(qū)那解決問題會(huì)變得更有效率。
出于安全因素,瀏覽器不允許我們進(jìn)入用戶操作系統(tǒng)獲取信息。即使它允許,我們也得知道在Windows,Linux,Mac,iOS,Android中從哪兒能獲得到時(shí)區(qū),這還不包括其他非主流操作系統(tǒng)。
新聞熱點(diǎn)
疑難解答
圖片精選