【问题标题】:Django timezone: feeling a bit confusedDjango时区:感觉有点困惑
【发布时间】:2011-07-25 21:36:45
【问题描述】:

因此,我们的设置中有“欧洲/莫斯科”TZ。 目前这意味着夏令时(这将在未来发生变化,但目前是 UTC+03/04)。

我知道在将日期保存到数据库以及提取日期时会使用此 TZ。

现在,我必须将 datetime 对象序列化为 ISO 字符串,包括 UTC 偏移量。这样做的正确方法是什么?

日期不包含 TZ 信息(即 d.strftime('%z') 为空)

我想我可以将它们转换为 UTC 并使用 +00:00 进行序列化,但是如果我不知道具体日期是 +03(莫斯科冬季)还是 +04(莫斯科夏季),我该如何将它们转换为 UTC )

【问题讨论】:

    标签: python django datetime timezone utc


    【解决方案1】:

    如果我不知道具体日期是 +03(莫斯科冬季)还是 +04(莫斯科夏季),如何将它们转换为 UTC

    不需要UTC转换,pytz为你处理。

    下面是从时区原始日期时间转换为带时区偏移量的 ISO 的代码:

    from datetime import datetime
    from pytz import timezone
    
    server_timezone = timezone('Europe/Moscow')
    
    server_timezone.localize(datetime(2011, 1, 1)).isoformat()
    >>> '2011-01-01T00:00:00+03:00'
    
    server_timezone.localize(datetime(2011, 7, 1)).isoformat()
    >>> '2011-07-01T00:00:00+04:00'
    

    【讨论】:

      【解决方案2】:

      首先运行new_dt = datetime.replace(tzinfo=tz) 以创建一个新的时区感知datetime。然后用%z 运行你的datetime.strftime()

      请注意,您不能直接将日期字符串转换回可识别时区的日期时间——datetime.strptime() 不支持%z。所以你需要创建一个幼稚的datetime 和一个tzinfo 然后像以前一样做datetime.replace(tzinfo=tz)

      一些有用的外部库:

      http://pytz.sourceforge.net/

      http://code.google.com/p/parsedatetime/

      http://labix.org/python-dateutil

      还可以尝试在 Stack Overflow 上搜索更多关于(Python OR django OR appengine)和(datetime OR timezone OR date OR time OR tzinfo)的问题。

      【讨论】:

      • new_dt = datetime.replace(tzinfo=tz) 你说tz 是什么意思?我知道 Django 保存日期时考虑到了“欧洲/莫斯科”。我怎么能把它转换成 UTC / 什么? tz 应该传递什么?
      • 看看它发布的pytz 链接,它有一堆tzinfo 实时时区项目,您可以将其作为tzinfo 部分传递给该函数。
      • 我接受了@sayap 的更具体的回答,但我感谢您的早期提示,并在此处投赞成票。
      【解决方案3】:

      ISO-8601 没有“时区”的概念,只有日期和时间,为方便起见,时间可以用“偏移量”表示。

      更烦人的是,datetime 只是半心半意地点头承认时区; datetime 对象的 tzinfo 属性是可选的,主线 python 没有提供该接口的实现。

      对此的标准答案是始终以 UTC 时间做所有事情;包括在 UTC 中使用服务器,而不是在本地时间。这实际上是一个不错的主意;不同的不是时代,而是个人用户喜欢阅读这些时代的方式(类似于更喜欢“42”而不是“0b101010”)。

      您可以通过将首选时区(如果每个人都在莫斯科,可能只是网站范围的偏好)与实际时间分开存储来满足用户(合理!)查看当地时区时间的愿望,然后您可以使用强大的时区库(如pytz)来执行本地时间的格式设置。

      【讨论】:

      • 这一切都是正确和可以理解的。不幸的是,该站点已经运行了一段时间(我刚刚加入团队),并且日期已经在 Django 存储的数据库中,设置中有欧洲/莫斯科。那么,我有没有机会从这些数据中恢复 UTC 时间?
      • 这是你的问题吗?从您的原始问题中不清楚您正在尝试将数据库从本地时间迁移到 UTC。如果是这样,您应该更新您的问题。
      • 我没有迁移数据库。我必须使用正确的偏移量从数据库中以 ISO 格式输出日期时间。我认为,问题的最后一句明确指出:“如果我不知道具体日期是 +03(莫斯科冬季)还是 +04(莫斯科夏季),我如何将它们转换为 UTC”
      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多