- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在广泛使用 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>)
>>>
datetime
对象说是
2015-12-02
- 什么是
generate_a_datetime
功能告诉我?是说“一个站在加拿大东部看日历的人看到的是“2015-12-02”吗?或者它的意思是“这是“2015-12-02 UTC”……但不要忘记调整这个到加拿大东部时区!”
>>> 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
似乎行为相似,但它们的控制台输出表明它们不同。
now_aware_with_django
和有什么区别和
now_aware_with_datetime
?
timezone.make_aware
或
datetime.replace
?
UTC
表示时间值没有变化。 “天真”似乎意味着时间没有与之关联的时区。
最佳答案
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_aware
或 datetime.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/
背景 我想要一个跟踪其自身状态的函数: var myObject = { myFunction: function () { var myself = this.myFunct
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
Windows 10 Creator's Update Edition 中为最终用户提供了一个新选项。最终用户可以在兼容性选项卡上将 EXE 的属性更改为“覆盖高 DPI 缩放行为”并将其设置为系统(
这个问题在这里已经有了答案: Windows Forms window changes its size when I create a WPF window (3 个答案) 关闭 4 年前。 所以
长期读者第一次海报。请温柔点。 我热衷于在 VB.net 中创建游戏。作为一名业余程序员,我免费赠送我的游戏。因为我是一个没有经过正式培训的业余爱好者,所以我尝试让自己了解正确的编程原则,并在进行 O
我正在将 Spring 插入现有的 Java EE Web 应用程序。我的 web.xml 中有以下几行: com.MyContextListener 然后跟随 MyContextList
我曾想将我的应用程序的新版本(WPF 通过 Desktop Bridge 转换为 UWP)发布到 Microsoft Store,但未能通过认证,并出现以下警告: File **.exe neithe
在我的“工具箱”中,我正在使用此功能: function dataAttuale() { $now = new DateTime(); $data
我有一个同时使用 winforms 和 WPF 的 C# 程序,我正在努力让它在高 DPI 环境中工作。目前,如果我从解决方案中删除所有 WPF 项目并运行它,它会很好地缩放,但是一旦我重新添加任何
我是一名优秀的程序员,十分优秀!