不知道大家有没有发现,在我们学习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> 标签是不可能到达到客户端,因为转义成 &lt;script&gt;。把字符串包裹在 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_日期和时间的更多相关文章

  1. [Java]Java日期及时间库插件 -- Joda Time.

    来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...

  2. SharePoint 2013 日期和时间字段格式设置

    前言 最近碰到一个需求,用户希望修改日期和时间字段的格式,因为自己的环境是英文的,默认的时间格式是[月/日/年]这样的格式,我也是碰到这个问题才知道,这是美式的时间格式,然而用户希望变成英式的时间格式 ...

  3. MySQL 日期、时间转换函数

    MySQL 日期.时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式.它是 str_to ...

  4. python笔记7:日期和时间

    Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. 时间 ...

  5. PHP的日期和时间处理函数

    1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...

  6. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...

  7. Sql Server系列:日期和时间函数

    1. 获取系统当前日期函数GETDATE() GETDATE()函数用于返回当前数据库系统的日期和时间,返回值的类型为datetime. SELECT GETDATE() 2. 返回UTC日期的函数G ...

  8. Sql Server函数全解(四)日期和时间函数

      日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分.相同 ...

  9. SQL Server 日期和时间函数

    http://www.cnblogs.com/adandelion/archive/2006/11/08/554312.html 1.常用日期方法(下面的GetDate() = '2006-11-08 ...

随机推荐

  1. 关于jQuery中环境配置中的问题

    一开始无法显示出效果,配置和代码如 这代码本没有错 但是就是无法显示 原因是我下载了2.x版本的jQuery,jQuery2.x版本是不支持IE6/7/8的,也有很多主流的浏览器无法显示出效果,于是在 ...

  2. php+MySQL+Ajax

    点赞功能原理.     图片. 1.connect.php文件 <?php $host="localhost"; $db_user="root"; $db ...

  3. poj1753改

    #include<iostream> char data[16]; int a[16]; int d[5]={0,-4,1,4,-1}; char b[16]; int flag; int ...

  4. ngix代理-- 摘抄

    有两个网站,http://192.168.1.3:80和http://192.168.1.3:81, 通过nginx的配置实现只用本机作为唯一的代理服务器,只用一个端口, 实现这样的效果:请求http ...

  5. python之路——面向对象(进阶篇)

    面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) class City: # 静态字段 countr ...

  6. MySql索引简介

    从"找"到B+树 索引是用来查找的. 折半查找是一种很优秀的方式.适合于 范围查找,固有缺点就是需要元素是有序的.二叉搜索树就是对折半查找的一种基础的实现. 但二叉搜索树当遇到特殊 ...

  7. js学习随笔

    prompt 提示; parse解析;slice划分,切片;sort排序: 移除样式,removeAttribute("style") document.getElementByI ...

  8. HDU1075

    题目大意: 给你一本火星词典,每个火星单词对应一个英文单词. 然后给你一篇火星文章,要求你翻译成英文. 要求如下: 如果这个火星单词用英文单词可以表示,就翻译成英文,如果没有这个单词,就原样输出.遇到 ...

  9. Ubuntu 查询 so 归属的 package

    . . . . . 今天 LZ 在运行一个程序的时候,出现找不到 so 库的情况: >$ ./core ./core: error : cannot open shared object fil ...

  10. iOS Core Animation之CALayer心得

    使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的AP ...