zoukankan      html  css  js  c++  java
  • 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>
    document.write(moment("%s").%s);
    </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=" 50px;height: 50px"></td><td><i>{{post.author.nickname}} says:</i><br>{{post.body}}<br>{{ momentjs(post.timestamp).fromNow() }}</td>
        </tr>
    </table>
  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/ninicwang/p/6029443.html
Copyright © 2011-2022 走看看