簡體   English   中英

Django中支持時區的對象-為什么datetime.time不支持時區?

[英]Timezone aware objects in Django - why is datetime.time not timezone aware?

我一直在努力理解為什么時間早於我正在建立的網站上顯示一個小時,但現在我已經弄清楚了。

我通過將對象(在我的模板中)拆分為date.day,date.month,date.year和date.time來顯示“ datetime”。 這樣就沒有對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 %}

除非將日期時間對象本地化,否則它是“不知道的”。 它知道時間,但不知道相關時間(例如,倫敦和舊金山的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模塊。

如果您使用datetime.timezone提供該信息,則datetime對象可以識別時區。 您可以通過將本地時間與UTC時間進行比較來以編程方式確定本地偏移量(例如datetime.now()datetime.utcnow() )。

時間是一種幻想。 午餐時間加倍。

如果您考慮一下,那么就有時間沒有時區的充分理由。 確實, 時間如何知道時區。 就其本身而言,這是不可能的。 時間只是一個數字。 這就像問你有多高。 如果您回答“ 42”,我怎么知道您是英寸,厘米還是英尺? 就其本身而言,數字是沒有意義的。 只有介紹了參考點才有意義。 更糟糕的是,如果您說的是42而我在考慮錯誤的單位(例如mm),那么我會想象完全錯誤的事情。

那么就准時了-時間代表什么? 它實際上只是相對於午夜*。 但是哪一個午夜? 如果沒有日期,則可能是最近的午夜,或者是兩周前的午夜。 你不知道 沒有參考點。 就像42 42 什么 13:00 什么時候

那就是時區進入的地方。(社會上)我們12:00同意,我們希望12:00大致對應於太陽的最高峰。 畢竟,我們需要知道午餐時間是什么時候。

但是,如果您在英國(GMT + 0),您幾乎不想在我正在美國阿肯色州(AMT)進餐的同時吃午餐(GMT-6)。 那會讓你在太陽下山時吃午飯,那簡直就是瘋了。

因此,時區使我們能夠以一種明智的方式談論事情-當我們說“午餐時間”時,我們都知道這意味着當太陽升起時12:00左右。 正如我們通常在談論當前的午餐時間(我的意思是,只要您有優先權),我們傾向於考慮今天的時間。 但是對於計算機而言,午餐的重要性就不那么重要了,因此它們唯一的方式是明確地表明我們是今天(2015年12月24日) 12:00還是明天(2015年12月25日-萬歲!告訴它。 而要知道我們是在阿肯色州在這里吃午餐,還是在南非開普敦吃午餐,唯一的辦法就是給我們一個時區。

所以不, 時間不知道時區不是錯誤

如果您想更改時區,則需要在日期時間進行操作然后從中獲取結果時間。

* 當然,您可以從任何其他角度進行爭論,並且您也是正確的!

** 如果您喜歡這種事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM