时间戳的问题
我们的微博应用的一个忽略了很久的问题就是日间和日期的显示。
直到现在,我们在我们的User和Post对象中使用Python它自己的方式来渲染时间对象,但这并不是一个好的解决方案。
考虑下这样的例子。我正在写这篇文章,此时正是12月31号下午3:54。我的时区是PST(或者你们更习惯的:UTC-8)。 在Python解释器中运行,我得到下面输出:
>>> 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()方法返回了正确的时间,但是now()调用返回的时间是UTC单位。
那么,使用哪个更好呢?
如果我们用now(),所有数据库里的时间戳将会与服务器运行的当地时间一致,这将会产生一些问题。
比如,如果有一天,我们需要将服务器放到别的地方(不在一个时区),那么在重启服务器之前,数据库里的时间都需要更新到与新地点保持一致。
还会有更为重要的问题。不同时区的用户将会很难知道什么时候发送邮件,如果用户看到的是PST时区的时间,他们就很难知道邮件是什么时候发送的,这就需要用户根据这个时间做相应的调整。
很显然这不是一个好的选择,这也是我们为什么在创建数据库时就使用UTC时区保存时间戳。
在标准化时间戳为UTC时,解决了移动服务器的问题。但是他不能解决第二个问题,数据和时间在世界上不同地方使用UTC展现给用户。
假设一个用户在PST时区下午3点发送了一封邮件,这封邮件立刻显示在他面前,上面写着11:00pm,或者更具体点(23:00)。
我写这个文章的目的也就是让我们的用户不再因为数据和时间的显示而困惑。
使用具体的时间戳
通常的解决方法是,每一个用户都从UTC转化到当地的时间。这就需要我们动态变化,从而使数据库的UTC与之保持一致。
但是我们怎么知道用户在哪呢?
许多网站都有一个设置页面设置他们的时区。这就需要我们添加一个新的页面,并在表单上提供下拉框让用户选择时区,用户第一次登录的时候需要设置时区,并把它作为注册的一部分。
这是一个正常的解决方法,但是这对于用户来说有点累赘,用户需要输入一条他们已经在操作系统中配置过的信息。所以如果我们能抓取到用户电脑里设置的时区那解决问题会变得更有效率。
出于安全因素,浏览器不允许我们进入用户操作系统获取信息。即使它允许,我们也得知道在Windows,Linux,Mac,iOS,Android中从哪儿能获得到时区,这还不包括其他非主流操作系统。
新闻热点
疑难解答