flask_日期和时间
不知道大家有没有发现,在我们学习flask的过程中,post的timestamp字段添加时间时一直用的是datetime.utcnow()来获取时间,但是它获取的时间跟本地时间不一样,下面我们来测试一下:
In[2]: from datetime import datetime
In[3]: now=datetime.now()
In[4]: print 'now:',now
now: 2016-11-04 09:45:31.896000
In[5]: utcnow=datetime.utcnow()
In[6]: print 'utcnow:',utcnow
utcnow: 2016-11-04 01:45:54.845000
我们将会看到utcnow获取的时间和now获取到的我们的本地时间不一样。但是为什么我们用utcnow获取时间而不是now直接获取当地时间呢?试想一下有一天我们想把服务器迁移到不同时区的地方,那么所有数据库中的时间戳必须修改成当地的正确时间在服务器重启之前。但是这还有一个更重要的问题。对于不同时区的用户很难清楚知道 blog 的发布时间因为他们看到的是在 PST 时区的时间。他们需要提前知道服务器的时区是 PST 才能做出适当的调整。显然,这不是一个好的选择,这是为什么开始使用我们的数据库的时候,我们决定我们总是以 UTC 时区存储时间戳。尽管用 UCT 时区标准化了时间戳解决了迁移服务器的问题。但是它解决不了第二个问题,日期和时间在世界上的任何地方都会以 UTC 形式呈献给用户。下面我们就来解决一下如何把utc时间转换为当地市区的时间。
一、介绍moment.js
moment.js 是一个小型的,自由的,开源的 Javascript 库,它能够渲染日期和时间。它提供了富有想象的格式化选项。为了在我们应用程序中使用 moment.js,我们需要在模板中写一点 Javascript。我们可以构建一个moment对象,moment对象一旦被构建之后它可以渲染各种格式的字符串


注:在所有的例子中,服务器渲染相同的 UTC 时间,在自己的网页浏览器中执行不同的渲染。我们现在缺少的就是让 moment 返回的字符串在页面上可见。实现这个最简单的方式就是 Javascript 的 document.write 函数:<script>document.write(moment("2012-12-31T23:55:13 Z").format('LLLL'));</script>
二、整合moment.js
(1)把下载下来的 moment.min.js 放入到 /static/js 文件夹,这样它就能作为一个静态文件提供给客户端。
(2)在我们的基础模板中添加对这个库的引用(文件 templates/base.html):
<script src="/static/js/moment.min.js"></script>
(3)创建一个 moment.js 封装,我们能在模版中调用这个封装。这会节省不少时间如果我们必须修改时间戳渲染代码,因为我们已经把它放在一个地方。(momentjs.py)
from jinja2 import Markup class momentjs(object):
def __init__(self, timestamp):
self.timestamp = timestamp def render(self, format):
return Markup("<script>\ndocument.write(moment(\"%s\").%s);\n</script>" % (self.timestamp.strftime("%Y-%m-%dT%H:%M:%S Z"), format)) def format(self, fmt):
return self.render("format(\"%s\")" % fmt) def calendar(self):
return self.render("calendar()") def fromNow(self):
return self.render("fromNow()")
注:ender 方法并不直接返回字符串而是把它放入了 Jinja2 提供的 Markup 对象中。原因是 Jinja2 默认情况下会自动转义,例如,我们的 <script> 标签是不可能到达到客户端,因为转义成 <script>。把字符串包裹在 Markup 对象里就是告诉 Jinja2 这个字符串是不需要转义的。
(4)将封装的类与jinja2绑定(microblog.py)
from momentjs import momentjs
app.jinja_env.globals['momentjs'] = momentjs
上面的代码就是告诉 Jinja2 导入我们的类作为所有模板的一个全局变量。
(5)修改模板(user.html)
{% if user.last_seen %}<p><em>Last seen: {{momentjs(user.last_seen).calendar()}}</em></p>{% endif %}
(6)修改模板(post.html)
<table>
<tr valign="top">
<td><img src="{{post.author.avatars()}}" style="width: 50px;height: 50px"></td><td><i>{{post.author.nickname}} says:</i><br>{{post.body}}<br>{{ momentjs(post.timestamp).fromNow() }}</td>
</tr>
</table>
flask_日期和时间的更多相关文章
- [Java]Java日期及时间库插件 -- Joda Time.
来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...
- SharePoint 2013 日期和时间字段格式设置
前言 最近碰到一个需求,用户希望修改日期和时间字段的格式,因为自己的环境是英文的,默认的时间格式是[月/日/年]这样的格式,我也是碰到这个问题才知道,这是美式的时间格式,然而用户希望变成英式的时间格式 ...
- MySQL 日期、时间转换函数
MySQL 日期.时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式.它是 str_to ...
- python笔记7:日期和时间
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. 时间 ...
- PHP的日期和时间处理函数
1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- Sql Server系列:日期和时间函数
1. 获取系统当前日期函数GETDATE() GETDATE()函数用于返回当前数据库系统的日期和时间,返回值的类型为datetime. SELECT GETDATE() 2. 返回UTC日期的函数G ...
- Sql Server函数全解(四)日期和时间函数
日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分.相同 ...
- SQL Server 日期和时间函数
http://www.cnblogs.com/adandelion/archive/2006/11/08/554312.html 1.常用日期方法(下面的GetDate() = '2006-11-08 ...
随机推荐
- SQL Server类型的对应关系
bit bool tinyint byte smallint short int int bigint long real float float double money decimal datet ...
- JCCLIENT IP GET UDP
##通道##110.52.233.5:18427## ##通道##112.95.251.214:18427## ##通道##119.29.192.206:18427## ##通道##123.207.1 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- PPTP-VPN第一章——部署与简单使用
最近前游戏同事搞了台的VPS,贡献出来做VPN使用.目前流行的服务器VPN软件主要有PPTP VPN和Openvpn.Openvpn虽然功能较为强大,且安全性高,支持nat穿越等等,但服务器端和客户端 ...
- 新版react踩坑总结
使用es6语法与原本es5语法几个有区别的地方 1.React.creatClass与React.Component var Component = React.createClass({ rende ...
- HUST 1017 - Exact cover (Dancing Links 模板题)
1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0 ...
- Expected one result (or null) to be returned by selectOne(), but found 2
这个问题在于你查询sql返回结果是多个值.一个集合,但是你在service的实现层的dao都调用了.get方法.而是应该使用.getlist方法等.
- uvm - dut
module dut(clk, rst_n, rxd, rx_dv, txd, tx_en); input clk; input rst_n; :] rxd; input rx_dv; :] txd; ...
- 启动Tomcat时报 Expected stackmap frame at this location.(JDK1.7编译)
从svn上下的项目,部署到tomcat 7.0.19 上, 并且配置的是jdk7. 启动时出现以下问题. Location: com/genlot/loms/service/SysPermissio ...
- NGUI 使用EventDelegate.Add与UIInput.onSubmit、UIInput.onChange限定编辑框中的内容
Unity中,使用NGUI,通常为某个控件(如按钮)绑定事件(单击.双击.拖拽.滚轮.选择等)都是用UIEventListener,比如: public void Bind() { UIEventLi ...