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

通过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 %}

显示效果示例:
【Python】为什么系统的时区是东八,但是存数据还是存的标准时?

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

数据库中(注意time_zone):
【Python】为什么系统的时区是东八,但是存数据还是存的标准时?

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

回答

因为你只有两种选择:

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

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

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

因为这是最好的作法。

这要做的好处有:

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

"时区"完全是一个显示概念,“UI”概念;

时间的存储本不应该跟”时区“扯上关系;

建议直接存毫秒数

考虑这样一个问题,你的用户来自世界各地,如果你的时间存储的是带某个时区的时间,那么另外不同时区的用户访问你的页面,你怎么把它转化为用户本地的时间来显示?

所以服务器上存储的都是UTC时间。在用户访问页面的时候,浏览器把UTC时间转换为当地的时间。在Flask中有moment这样一个扩展专门做这个工作,我没有仔细看你的代码,不过我相信同为python web框架,原理都是一样的。

以上是 【Python】为什么系统的时区是东八,但是存数据还是存的标准时? 的全部内容, 来源链接: utcz.com/a/80809.html

回到顶部