Django中的时区感知对象 - 为什么datetime.time不能识别时区?

时间:2015-09-02 19:08:32

标签: python

我很难理解为什么时间会在我建立的网站上提前一小时显示,但我现在已经想到了这一点。

我正在显示' datetime'通过将对象(在我的模板中)拆分为date.day,date.month,date.year和date.time。然后,date.time不是时区转换的(来自数据库中的UTC值)。在伦敦,由于夏令时,时区目前为UTC + 1,因此网站上显示的时间比我放入管理界面的时间慢一个小时。然后我发现,如果在模板中我只是放了{{date}},那么 的时间是本地化的。

这是预期的行为吗?为什么date.time不能识别时区?

由于

{% load tz %}

        Timezone conversion on:<br> 
        {% localtime on %}
            {{ event.date }} 
                {# time converted correctly #}
            <br>
            {{ event.date.day }}/{{ event.date.month }}/{{ event.date.year }}, {{ event.date.time }}
                {# time not converted  #}
            <br>
        {% endlocaltime %}

        Timezone conversion off:<br>
        {% localtime off %}
            {{ event.date }}
                {# time not converted, as expected as timezone conversion is off #}
            <br>
            {{ event.date.day }}/{{ event.date.month }}/{{ event.date.year }}, {{ event.date.time }}
                {# time not converted, as expected as timezone conversion is off #}
            <br>
        {% endlocaltime %}

3 个答案:

答案 0 :(得分:0)

除非日期时间对象已本地化,否则它不会发现&#39;。它知道时间,但不知道相关时间(例如伦敦和旧金山的09:00是相同的,尽管8小时的时差)。

您需要自己明确设置时区。

from pytz import timezone
import datetime as dt

tz = timezone('UTC')
>>> print(dt.datetime.now());print(dt.datetime.now(tz))
2015-12-24 07:29:09.758346
2015-12-24 15:29:09.758426+00:00

你不能让时间本身有时区意识。怎么知道在哪一天调整夏令时?

  

处理时间的首选方法是始终使用UTC,   仅在生成要读取的输出时转换为本地时间   人类。

有关其他示例,请参阅pytz模块。

答案 1 :(得分:0)

如果您使用datetime.timezone class提供该信息,则

datetime个对象可以识别时区。您可以通过将本地时间与UTC时间进行比较来以编程方式确定本地偏移量(例如datetime.now()datetime.utcnow())。

答案 2 :(得分:0)

  

时间是一种幻觉。午餐时间加倍。

如果你考虑一下,那么有时间没有时区就有充分的理由。实际上,时间如何才能意识到时区。它本身是不可能的。时间只是一个数字。这就像问你有多高。如果您回答“42”,我怎么知道你的英寸,厘米还是英尺?这个数字本身就没有意义。只有在你介绍一个有意义的参考点之后。更糟糕的是,如果你说42而我正在考虑错误的单位(比方说,mm)那么我会想象一个完全错误的事情。

所以时间 - 时间代表什么?它实际上只是相对于午夜*。但哪个午夜?没有约会,可能是最近的午夜,也可能是两周前的午夜。你不知道。没有参考点。这就像4242 什么? <{1}} 何时

这就是时区的用武之地。我们(大多数时候)同意社会,我们希望13:00大致对应太阳的顶峰。毕竟,我们需要知道午餐时间是什么时候。

但如果你在英国(格林尼治标准时间+0),你几乎不想在我在美国阿肯色州(GMT-6)吃我的午餐时吃午餐。当太阳下山时,那会让你吃午饭,这只是疯狂的谈话。

因此,时区允许我们以合理的方式谈论事物 - 当我们说“午餐时间”时,我们都知道这意味着当太阳升起时 - 12:00左右。由于我们通常谈论当前的午餐时间(我的意思是,只要你的优先顺序是直的),我们倾向于考虑今天的时间。但是对于电脑而言,午餐并不那么重要,所以他们只知道我们今天(2015年12月24日)或明天午餐(2015年12月25日 - 万圣节!**)的意思是12:00明确告诉它。如果我们给阿肯色州提供午餐,或者在南非开普敦吃午餐,我们唯一可以知道的是,如果我们给它一个时区的话。

所以不,时间不是时区感知不是错误

如果您想更改时区,您需要在日期时间执行此操作,然后从 获取结果时间。

* 当然你可以从任何其他方面争论,你也是对的!

** 如果您遇到这种情况。