Flask学习笔记:时间与日期

1. 做好准备工作
  • 进入项目主目录
  • 激活虚拟环境


2. 时区

在服务器上用Python来渲染时间和日期不是个好主意。比如我在2017年9月28日下午4:06写这篇文章。此时我的时区是PDT。在Python解释器中运行得到如下输出:

>>> from datetime import datetime
>>> str(datetime.now())
'2017-09-28 16:06:30.439388'
>>> str(datetime.utcnow())
'2017-09-28 23:06:51.406499'

调用 datetime.now() 得到了我本地的正确时间输出,而调用 datetime.utcnow() 则返回 UTC 时间。如果我让世界其他地方的人与我同时运行 datetime.now() 函数,每个人的返回结果都是不同的,但运行 datetime.utcnow() 会返回同样的时间。

显然服务器必须管理与未知以置且独立的时间。由于UTC是最常用的统一时区,并且 datetime 类支持它,所以我会使用UTC时间。

但这种方法有一个问题,对于不同时区的用户来说,他们没办法判断帖子到底是什么时候发布的。


3. 时区转换

解决这个问题是方法是把存储的UTC时间转换成各个用户的本地时间。这使得服务器用UTC保持了时间的一致性,又通过针对不同用户的实时转换解决了可用性问题。这个方案的棘手部分是了解每个用户的位置。

事实上, web浏览器知道用户的时区,并通过标准的时间和日期 JavaScript API公开它,实际上有两种方法来利用JavaScript提供的时区信息:

  • 一种是让web浏览器在用户第一次登录应用的时候将时区信息发送给服务器。这可以用AJAX调用来完成,或者用meta refresh tag来完成。一旦服务器知道了时区,它就可以将其保存到用户的session中,或者将其写入数据库中的用户条目中,然后在呈现模板是调整所有时间戳。
  • 另一种是不改变服务器中的信息,用JavaScript在客户端将UTC转换为本地时区。

两种选择都有用,但第二个更好。知道用户所在的时区并不足以以用户期望的格式来显示日期和时间。浏览器还可以访问系统区域设置,该配置指定诸如12小时制还是24小时制,DD/MM/YYYY 还是 MM/DD/YYYY 或其他风格的方式。

如果这还不够,后者还有个有时。有个开源库可以完成这些工作。


4. Moment.js 和 Flask-Moment

Moment.js 是一个小型的开源JavaScript库,可以将时间和日期转换为其他格式。Miguel创建了Flask-Moment,这是非小型的Flask拓展,方便将moment.js 合并入Flask应用。

下面安装Flask-Moment:

(venv) $ pip install flask-moment

将拓展加入Flask应用:

app/__init__.py

# ...
from flask_moment import Moment

app = Flask(__name__)
# ...
moment = Moment(app)

不行其他应用, Flask-Moment与moment.js 一起工作,所以模板必须要包括这个库。我将它加入base模板,方法有两种,一种是显式的添加

你可能感兴趣的:(Flask学习笔记:时间与日期)