【发布时间】:2016-03-07 09:40:53
【问题描述】:
我一直在 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>)
>>>
控制台输出对我来说似乎模棱两可:
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>)
>>>
对象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) 原始日期时间和 UTC 日期时间有什么区别?看起来它们完全一样 - 没有对实际时间值施加任何转换。
Q5) 我如何知道何时要使用原始时间以及何时要使用 UTC 时间?
如果我能得到所有 5 个问题的答案,那就太好了。非常感谢!
【问题讨论】:
标签: python django datetime pytz