为什么要用
服务器需要统一时间单位,这和用户所在的地理位置无关,所以一般使用协调世界时(UTC),但用户更希望看到当地时间,而且采用当地惯用的格式
要想在服务器上只使用UTC,可以把时间单位发给Web浏览器,然后转换成当地时间并渲染
有个JS的日期处理类库Moment.js
,它可以在浏览器中渲染日期和时间,Flask-Moment拓展集成了moment.js
到Jinja2模板中,该拓展还依赖jquery.js
,不过已经在上文的Bootstrap中引入了,无需再引
如何用
先安装:
pip install flask-moment
初始化:
from flask_moment import Moment
moment = Moment(app)
在base模板的scripts块中引入这个库:
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
处理时间戳,把变量current_time
传入模板进行渲染:
from datetime import datetime
@app.route('/')
def index():
return render_template('index.html', current_time=datetime.utcnow())
接下来在模板(index.html)中渲染current_time:
{% extends "base.html" %}
{% block title %}首屋{% endblock %}
{% block page_content %}
<h1>这里是一切的起点</h1>
<h2>现在时刻:{{ moment(cur_time).format('LLL') }}</h2>
{% endblock %}
format('LLL')
根据客户端的时区和区域设置渲染日期时间,参数’L’到’LLLL’分别对应不同的复杂度,format()
函数还可接受自定义的格式说明符:
举个栗子,传入时间变量(出生年月)到渲染模板:
from flask import render_template
from datetime import date
@main.route('/')
def index ():
return render_template('index.html', time = date(1995,7,1))
然后在模板中渲染,通过fromTime()
获得差值,即年龄
<h2>现在时刻:{{ moment().format('L') }}</h2>
<h2>已经度过:{{ (moment(time).fromNow(true))}}</h2>
运行:
fromNow()
指定refresh
参数后,其内容会随着时间的推移而更新
Flask-Moment实现了moment.js
中的format()
、fromNow()
、fromTime()
、calendar()
、valueOf()
和unix()
方法,具体看Moments.js文档
Flask-Moment渲染的时间戳可实现多种语言的本地化,语言可在模板scripts块中设置,改为中文格式:
{{ moment.lang('zh-cn') }}