gpt4 book ai didi

python - Django/python - 消除关于日期和时区意识的混淆

转载 作者:行者123 更新时间:2023-12-04 21:37:45 26 4
gpt4 key购买 nike

我一直在广泛使用 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_djangonow_aware_with_datetime似乎行为相似,但它们的控制台输出表明它们不同。

Q2) now_aware_with_django 和有什么区别和 now_aware_with_datetime ?

Q3) 我怎么知道我是否需要使用 timezone.make_awaredatetime.replace ?

原始日期时间与 UTC 日期时间
UTC表示时间值没有变化。 “天真”似乎意味着时间没有与之关联的时区。

Q4)天真和UTC日期时间有什么区别?看起来它们完全相同 - 都不会对实际时间值施加任何转换。

Q5) 我怎么知道我什么时候想用朴素时间,什么时候想用 UTC 时间?

如果我能得到所有 5 个问题的答案,那就太好了。非常感谢!

最佳答案

Q1) 这个 datetime 对象说是 2015-12-02 - generate_a_datetime 函数告诉我什么?是说“一个站在加拿大东部看日历的人看到的是“2015-12-02”吗?或者它的意思是“这是“2015-12-02 UTC”……但不要忘记调整这个到加拿大东部时区!”

第一个解释是正确的。时区感知日期时间已经为您“调整”了,tzinfo 只是告诉您它指定在哪个时区。

Q2) now_aware_with_django 和有什么区别和 now_aware_with_datetime ?

对于第一种情况,您正在创建一个日期时间,它表示与“天真的”时间点相同的时间点,并且假设天真的时间在您的本地时区。

对于第二种情况,您是说天真的一个已经在您提供的时区中,然后您只需添加 tzinfo。

Q3) 我怎么知道我是否需要使用 timezone.make_awaredatetime.replace?

好吧,因为它们做不同的事情,所以你需要知道你想要做什么才能知道使用哪个。如果您想将原始时区(在您的本地时间)转换为不同的时区,您可以使用 make_aware为了那个原因。如果您已经知道原始日期时间的时区,则只需使用替换(或查看 localize 中的 pytz ,这对这项任务要小心一些)。

注意:通常,如果您一开始就有任何幼稚的日期时间,那么您之前做错了什么,您应该更早地发现它。尝试让他们在您的应用程序的边界了解他们 - 我将在 Q5 中详细说明这一点。

Q4)天真和UTC日期时间有什么区别?看起来它们完全相同 - 都不会对实际时间值施加任何转换。

一个天真的日期时间只是一个日期时间,它不会告诉你它在哪个时区。它不一定是 UTC,它可以是任何东西。它类似于字节串和 unicode - 您必须知道编码是什么才能说明解码的字节在说什么。对于天真的日期时间,您必须先知道它所在的时区,然后才能说出它实际代表的时间。因此,从这个意义上说,UTC 日期时间比单纯的日期时间提供更多信息。

UTC 是协调世界时,怪异的首字母缩写词怪法国人。时区通常定义为与 UTC 相差整数小时,出于所有实际目的,您可以将 UTC 视为与 UTC 相差 0 小时的时区。它就像格林威治标准时间,没有任何夏令时废话。

Q5) 我怎么知道我什么时候想用朴素时间,什么时候想用 UTC 时间?

对此存在不同意见。我的建议是始终在您的应用程序中使用 UTC 中的所有内容(并且也只将 UTC 存储在数据库中!)。当任何日期时间数据进入您的应用程序时,无论它进入您的应用程序,请确保它正确转换为 UTC。这也意味着您的应用程序中使用 datetime.now() 的任何地方(这是一个带有“缺失”的 tzinfo 的幼稚日期时间,它应该是机器的本地时区)改为使用 datetime.utcnow() (这是一个天真的 UTC 日期时间)甚至更好 datetime.now(tz=pytz.utc) (这是时区感知)。

仅在应用程序的“显示”端更改为本地时区。您通常可以使用模板标签,甚至客户端 js 来做到这一点。

关于python - Django/python - 消除关于日期和时区意识的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34054754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com