Flask 教程,第十三部分:日期和时间 已翻译 100%

lomatus 投递于 2013/01/16 17:22 (共 15 段, 翻译完成于 01-22)
阅读 5479
收藏 6
1
加载中

这是 我介绍自己的在使用 Python使用 Flask 这个轻量级web框架 的 经验 这个系列 中的第十三篇文章

因为这系列的教程主要是深入的介绍关于微博应用程序的深入开发,所以比较缺少创新性,在此我就称它为“微博”吧!

下面这些部分我在之前已经发表了。大家有空可以去看看

l
翻译于 2013/01/16 22:07
2

关于github的简短说明

有些人可能没有注意到,最近我将这个微博客应用托管到了github上去了。

你可以在以下地址找到此仓库:
https://github.com/miguelgrinberg/microblog

为了方便大家,我为教程的每一步都打上了标签。(译者注:指每一个标签指向教程的不同git历史版本记录)

代码会说话
翻译于 2013/01/17 01:19
1

时间戳的问题

我们的微博应用的一个忽略了很久的问题就是日间和日期的显示。

直到现在,我们在我们的User和Post对象中使用Python它自己的方式来渲染时间对象,但这并不是一个好的解决方案。

考虑下这样的例子。我正在写这篇文章,此时正是12月31号下午3:54。我的时区是PST(或者你们更习惯的:UTC-8)。 在Python解释器中运行,我得到下面输出:

>>> from datetime import datetime
>>> now = datetime.now()
>>> print now
2012-12-31 15:54:42.915204
>>> now = datetime.utcnow()
>>> print now
2012-12-31 23:55:13.635874

在我所在的地方,now()方法返回了正确的时间,但是now()调用返回的时间是UTC单位。

代码会说话
翻译于 2013/01/17 01:42
1

那么,使用哪个更好呢?

如果我们用now(),所有数据库里的时间戳将会与服务器运行的当地时间一致,这将会产生一些问题。

比如,如果有一天,我们需要将服务器放到别的地方(不在一个时区),那么在重启服务器之前,数据库里的时间都需要更新到与新地点保持一致。

还会有更为重要的问题。不同时区的用户将会很难知道什么时候发送邮件,如果用户看到的是PST时区的时间,他们就很难知道邮件是什么时候发送的,这就需要用户根据这个时间做相应的调整。

Naixjs
翻译于 2013/01/17 18:54
1

很显然这不是一个好的选择,这也是我们为什么在创建数据库时就使用UTC时区保存时间戳。

在标准化时间戳为UTC时,解决了移动服务器的问题。但是他不能解决第二个问题,数据和时间在世界上不同地方使用UTC展现给用户。

假设一个用户在PST时区下午3点发送了一封邮件,这封邮件立刻显示在他面前,上面写着11:00pm,或者更具体点(23:00)。

我写这个文章的目的也就是让我们的用户不再因为数据和时间的显示而困惑。

Naixjs
翻译于 2013/01/17 19:26
1

使用具体的时间戳

通常的解决方法是,每一个用户都从UTC转化到当地的时间。这就需要我们动态变化,从而使数据库的UTC与之保持一致。

但是我们怎么知道用户在哪呢?

许多网站都有一个设置页面设置他们的时区。这就需要我们添加一个新的页面,并在表单上提供下拉框让用户选择时区,用户第一次登录的时候需要设置时区,并把它作为注册的一部分。

Naixjs
翻译于 2013/01/17 17:59
1

这是一个正常的解决方法,但是这对于用户来说有点累赘,用户需要输入一条他们已经在操作系统中配置过的信息。所以如果我们能抓取到用户电脑里设置的时区那解决问题会变得更有效率。

出于安全因素,浏览器不允许我们进入用户操作系统获取信息。即使它允许,我们也得知道在Windows,Linux,Mac,iOS,Android中从哪儿能获得到时区,这还不包括其他非主流操作系统。

在浏览器中得到用户的时区,然后通过标准的Javascript API获取到。在Web 2.0世界中用户允许Javascript执行(很少有网站不使用Javascript),所以通过Javascript获取用户时区是可行的。

se77en
翻译于 2013/01/22 12:57
1

我们用Javascript有两种方式配置可用的时区:

  • 老派的做法:当用户第一次登录服务器时让浏览器以某种方式发送时区信息给我们。这个可以通过Ajax调用,或者更简单的通过meta refresh tag来实现。一旦服务器知道了时区信息,它就能保存它在用户session中,然后调整所有页面的时间显示。
  • 新派的做法:不改变服务器端的任何东西,但仍然会发送UTC时间戳到客户端浏览器。转换UTC到本地时间的工作通过Javascript在客户端执行。


se77en
翻译于 2013/01/22 13:11
1

两种方法都是有效的,但第二种更有优势一点。浏览器能依照系统本地配置最好滴完成时间转换。像上午/下午 vs 24小时制,日/月/年 vs 月/日/年 还有其他各种文化的格式,这些格式都是浏览器可访问的,但服务器就不一定了。

如果这些还不够,那新派的做法还有一个更大的优势,而且别人已经为我们做了这件事(moment.js要登场了)!

se77en
翻译于 2013/01/22 13:19
1

moment.js简介

Moment.js 是一个小、免费、开源的Javascript库,它将日期和事件提升到另一个等级。它提供了能想象到的所有的时间日期格式,下面就是一些。

要在我们的应用中使用moment.js就需要在我们的模板文件中写那么一丢丢的Javascript代码。我们先来通过ISO 8601 时间来创建一个moment对象。例如:通过上面Python例子的UTC时间来创建一个moment对象,就像这样:

moment("2012-12-31T23:55:13 Z")

一旦对象被创建,它就可以被转化成各种各样格式类型的string。例如,将一个灰常冗长的时间显示转换为本地系统的时间:

moment("2012-12-31T23:55:13 Z").format('LLLL');

下面就是转换以后的时间显示:

Tuesday, January 1 2013 7:55 AM

se77en
翻译于 2013/01/22 11:09
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(2)

kason66
kason66
js原生的toLocaleString()也可以根据客户端设置的时间格式完成timestamp转化为用户本地时间。
知之为知之
知之为知之
还有几部分章节,希望您可以继续,感谢
返回顶部
顶部