【问题标题】:adding tzinfo for naive datetime cause strange offset?为天真的日期时间添加 tzinfo 会导致奇怪的偏移量?
【发布时间】:2021-11-01 16:52:19
【问题描述】:

我只是想为我的datetime 对象添加tzinfo(没有具体时间)。我有str 格式的日期和str 格式的时区。 我创建了这个函数:

from datetime import datetime
import pytz

def _converttime(dt_str, tz_str):
    dt = datetime.fromisoformat(dt_str)
    tz = pytz.timezone(tz_str)
    dt = dt.replace(tzinfo=tz)
    return dt

当我使用 tzinfo 时,一切看起来都很好,例如:“Etc/GMT-6”:

a = _converttime("2018-01-01", "Etc/GMT-6")
        print(f'a: {a}')
>>a: 2018-01-01 00:00:00+06:00

但是看看这个:

 b = _converttime("2018-01-01", "Europe/Kirov")
        print(f'b: {b}')
>>b: 2018-01-01 00:00:00+03:19

c = _converttime("2018-01-01", "America/Panama")
        print(f'c: {c}')
>>c: 2018-01-01 00:00:00-05:18

为什么应该是 03:00、-05:00 时却得到 03:19、05:18 这样的奇怪值?它最近引起了问题。

【问题讨论】:

    标签: python datetime pytz


    【解决方案1】:

    我认为你想要做的是使用tz.localize,你的功能会变成:

    from datetime import datetime
    import pytz
    
    def _converttime(dt_str, tz_str):
        dt = datetime.fromisoformat(dt_str)
        tz = pytz.timezone(tz_str)
        dt = tz.localize(dt)
        return dt
    

    使用此功能,您可以获得正确的结果。

    【讨论】:

    • 在那里,在日期时间(不是日期)对象中:docs.python.org/3/library/… dt = tz.localize(dt) 只是放置我自己的本地时区 - 它不能是具体的(就像存储在 tz_str 中的那样)
    • 您对日期时间的看法是正确的,对此感到抱歉(我将删除该部分)。但我认为你对本地化是错误的。我发现 this question 可以帮助澄清事情。我已经测试了代码,它给出了:Europe/Kirov b: 2018-01-01 00:00:00+03:00 America/Panama c: 2018-01-01 00:00:00-05:00 我认为预期的结果在哪里
    【解决方案2】:

    好的,我不知道这有什么问题,但我使用 django make_aware 找到了解决方案:

    from django.utils.timezone import make_aware
    
    def _converttime2(dt_str, tz_str):
        dt = datetime.fromisoformat(dt_str)
        tz = pytz.timezone(tz_str)
        dt = make_aware(dt, tz)
        return dt
    

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 2010-10-22
      • 2021-07-07
      • 2015-06-15
      • 1970-01-01
      • 2012-05-05
      • 2018-02-03
      相关资源
      最近更新 更多