为什么系统的时区是东八,但是存数据还是存的标准时?

无非
  • 341

通过DjangoAPI来存:

pythonfrom django.db import models


class Chirp(models.Model):
    content = models.TextField()
    pub_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.content[:20]+ '...'

template中:

html{% for chirp in chirp_page %}
        <div class="chirp_item">
            <span class="timestamp">
                {{ chirp.pub_time.hour }}:{{ chirp.pub_time.minute }},
                {{ chirp.pub_time.day }}-{{ chirp.pub_time.month }}-{{ chirp.pub_time.year }}
                &nbsp;说:{{ chirp.pub_time }}
            </span>
            <p class="chirp">{{ chirp.content }}</p>
        </div>
    {% endfor %}

显示效果示例:
片描
因为我在Django项目里面也设置了时区,所以后面那个时间能正确显示(是这个原因吧。。。),但是通过属性来取的时候就跟数据库里一样了,看下面的图。

数据库中(注意time_zone):
数据库查询

系统的时区:
时区

回复
阅读 4.3k
5 个回答
✓ 已被采纳

因为你只有两种选择:

  1. 要么所有时间都存成带时区的
  2. 要么所有时间都存成同一个时区的

第一项会造成很多不必要的存储和麻烦(不能直接比较和计算),所以大家都用第二项。而用什么时区呢?根据定义,UTC 最靠谱。别的时区由于各种各样的原因名称、适用地域和与UTC的偏移都会变化。

数据库存的是UTC时间, 如果设置了时区, 显示的时候就根据相应的规则进行转换

因为这是最好的作法。
这要做的好处有:

  1. 万一你想要个功能,可以根据客户的地理位置显示不同时间?
  2. 默认所有的时间都是 UTC 时间,这样,不管对接什么系统,都不用再加一个时区信息了。大家都知道这个是 UTC 的,然后根据需求转换。

"时区"完全是一个显示概念,“UI”概念;
时间的存储本不应该跟”时区“扯上关系;
建议直接存毫秒数

cnnic17173
  • 2
新手上路,请多包涵

考虑这样一个问题,你的用户来自世界各地,如果你的时间存储的是带某个时区的时间,那么另外不同时区的用户访问你的页面,你怎么把它转化为用户本地的时间来显示?
所以服务器上存储的都是UTC时间。在用户访问页面的时候,浏览器把UTC时间转换为当地的时间。在Flask中有moment这样一个扩展专门做这个工作,我没有仔细看你的代码,不过我相信同为python web框架,原理都是一样的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏