Ger*_*ica 5 python django datetime pytz
我一直在使用python/django中的日期进行广泛的工作.为了解决各种用例,我一直在盲目地尝试各种不同的方法,直到其中一个工作,而没有学习各种功能如何工作的逻辑.
现在是关键时刻.我想问一下关于django/python中日期和时区错综复杂的几个问题.
如何解释datetime已有时区的对象?
为了澄清,让我说我做以下事情:
>>> generate_a_datetime()
datetime.datetime(2015, 12, 2, 0, 0, tzinfo=<DstTzInfo 'Canada/Eastern' LMT-1 day, 18:42:00 STD>)
>>>
Run Code Online (Sandbox Code Playgroud)
控制台输出对我来说似乎不明确:
Q1)这个datetime对象说的是2015-12-02- generate_a_datetime告诉我的功能是什么?是不是说"一个站在加拿大东部看着他的日历的人看到了"2015-12-02"?或者它的意思是"这是"2015-12-02 UTC"...但是别忘了调整这个到加拿大东部时区!"
django.utils.timezone.make_aware让我困惑.
例如:
>>> from django.utils import timezone
>>> import pytz
>>> tz = pytz.timezone('Canada/Eastern')
>>> now_unaware = datetime.datetime.now()
>>> now_aware_with_django = timezone.make_aware(now_unaware, tz)
>>> now_aware_with_datetime = now_unaware.replace(tzinfo=tz)
>>> now_unaware
datetime.datetime(2015, 12, 2, 22, 1, 19, 564003)
>>> now_aware_with_django
datetime.datetime(2015, 12, 2, 22, 1, 19, 564003, tzinfo=<DstTzInfo 'Canada/Eastern' EST-1 day, 19:00:00 STD>)
>>> now_aware_with_datetime
datetime.datetime(2015, 12, 2, 22, 1, 19, 564003, tzinfo=<DstTzInfo 'Canada/Eastern' LMT-1 day, 18:42:00 STD>)
>>>
Run Code Online (Sandbox Code Playgroud)
该对象now_aware_with_django并now_aware_with_datetime似乎表现相似,但他们的控制台输出表明它们是不同的.
Q2)now_aware_with_django和之间有什么区别now_aware_with_datetime?
Q3)我如何知道是否需要使用timezone.make_aware或datetime.replace?
天真的日期时间与UTC日期时间
UTC表示时间值没有变化."天真"似乎意味着时间没有与之相关的时区.
Q4)naive和UTC日期时间有什么区别?看起来它们完全相同 - 既没有对实际时间值进行任何转换.
Q5)我怎么知道我什么时候想要使用天真时间,以及什么时候想要使用UTC时间?
如果我能得到所有5个问题的答案,那将是非常出色的.非常感谢!
Q1) 这个日期时间对象说的是 2015-12-02 -generate_a_datetime 函数告诉我什么?它是说“一个站在加拿大东部的人看着他的日历看到“2015-12-02”吗?或者它的意思是“这是“2015-12-02 UTC”......但不要忘记调整这个到加拿大东部时区!”
第一个解释是正确的。时区感知日期时间已经为您“调整”,并且 tzinfo 只是告诉您它指定在哪个时区。
now_aware_with_djangoQ2)和 之间有什么区别now_aware_with_datetime?
对于第一种情况,您要创建一个日期时间,它表示与“天真的”日期时间相同的时间点,并且假设天真的日期时间位于您当地的时区。
对于第二种情况,您是说天真的时区已经在您提供的时区中,然后您只需添加 tzinfo 即可。
Q3) 我怎么知道我是否需要使用timezone.make_aware或datetime.replace?
好吧,因为它们做不同的事情,所以您需要知道您要做什么才能知道使用哪个。如果您想从一个简单的时区(以您的当地时间)转换为另一个时区,您可以使用make_aware它。如果您已经知道原始日期时间的时区,则只需使用替换(或查看localizein pytz,这对于此任务要更加小心)。
注意:通常,如果您一开始就有任何幼稚的日期时间,那么您早些时候就做错了一些事情,您应该尽早发现这一点。尝试让他们了解您应用程序的边界 - 我将在第五季度对此进行更多介绍。
Q4) naive 日期时间和 UTC 日期时间有什么区别?看起来它们是完全相同的 - 都没有对实际时间值进行任何转换。
简单的日期时间只是一个日期时间,它不会告诉您它所在的时区。它不一定是 UTC,它可以是任何东西。它类似于字节串和 unicode - 你必须知道编码是什么才能说出解码后的字节所说的内容。对于简单的日期时间,您必须先知道它所在的时区,然后才能说出它实际代表的时间。因此从这个意义上说,UTC 日期时间比简单的日期时间提供更多信息。
UTC 是协调世界时间,这个奇怪的缩写词归咎于法语。时区通常被定义为与 UTC 相差整数小时,出于所有实际目的,您可以将 UTC 视为与 UTC 相差 0 小时的时区。就像 GMT 一样,没有任何夏令时的废话。
Q5) 我如何知道何时要使用朴素时间,何时要使用 UTC 时间?
对此,存在不同意见。我的建议是始终使用应用程序内 UTC 格式的所有内容(并且也仅将 UTC 存储在数据库中!)。当任何日期时间数据进入您的应用程序时,无论它以何种方式进入您的应用程序,请确保将其正确转换为 UTC。这也意味着应用程序内datetime.now()任何使用(这是一个天真的日期时间,其中“丢失”tzinfo 应该是机器的本地时区)而不是使用datetime.utcnow()(这是一个 UTC 中的天真的日期时间)甚至更好datetime.now(tz=pytz.utc)(这是时区)意识到的)。
仅在应用程序的“显示”端更改为本地时区。您通常可以使用模板标签甚至客户端 js 来完成此操作。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |