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


通过 Django API 来存:


 python


 from 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 }}
                 说:{{ chirp.pub_time }}
            </span>
            <p class="chirp">{{ chirp.content }}</p>
        </div>
    {% endfor %}

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

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

系统的时区:
时区

python python3.x mysql django l10n

一捆大木棍 9 years, 10 months ago

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

灰机灰来灰去 answered 9 years, 10 months ago

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

DK圈圈老师 answered 9 years, 10 months ago

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

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

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

连续忘三个号 answered 9 years, 10 months ago

因为你只有两种选择:

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

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

悟空大战八戒 answered 9 years, 10 months ago

Your Answer