【问题标题】:Python Datetime : use strftime() with a timezone-aware datePython Datetime:将 strftime() 与时区感知日期一起使用
【发布时间】:2018-02-10 19:48:43
【问题描述】:

假设我有这样的日期d

>>> d 
datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))

如您所见,它是“时区感知”的,有 2 小时的偏移量,utctime 是

>>> d.utctimetuple() 
time.struct_time(tm_year=2009, tm_mon=4, tm_mday=19, 
                 tm_hour=23, tm_min=12, tm_sec=0, 
                 tm_wday=6, tm_yday=109, tm_isdst=0)

那么,真正的 UTC 日期是 2009 年 3 月 19 日 23:12:00,对吗?

现在我需要用字符串格式化我的日期,我使用

>>> d.strftime('%Y-%m-%d %H:%M:%S.%f') 
'2009-04-19 21:12:00.000000'

这似乎没有考虑到这个偏移量。如何解决?

【问题讨论】:

    标签: python datetime utc


    【解决方案1】:

    除了@Slam 已经回答的内容:

    如果你想输出没有任何偏移的UTC时间,你可以这样做

    from datetime import timezone, datetime, timedelta
    d = datetime(2009, 4, 19, 21, 12, tzinfo=timezone(timedelta(hours=-2)))
    d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f')
    

    请参阅 Python 文档中的 datetime.astimezone

    【讨论】:

    • 如何在 Python 2.7 中完成?那里没有timezone 模块
    【解决方案2】:

    原因是 python 实际上格式化了你的 datetime 对象,而不是一些“此时的 UTC”

    要以格式显示时区,请使用%z%Z

    查找strf docs了解详情

    【讨论】:

    • 因为默认情况下%z 似乎给出了不带冒号的偏移量(:),这也可能有用:gist.github.com/mattstibbs/a283f55a124d2de1b1d732daaac1f7f8
    • 是的,python 仍然不提供对%:z 格式的支持,但只是在您的要点上警告您:python 中支持亚分钟 TZ,因此您的代码可能会因外来数据而中断
    【解决方案3】:

    这会将您的本地时间转换为 UTC 并打印出来:

    import datetime, pytz
    from dateutil.tz.tz import tzoffset
    
    loc = datetime.datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
    
    print(loc.astimezone(pytz.utc).strftime('%Y-%m-%d %H:%M:%S.%f') )
    

    (http://pytz.sourceforge.net/)

    【讨论】:

      【解决方案4】:

      我无法导入时区模块(也没有太多时间知道原因) 所以我设置了覆盖 /etc/localtime 信息的 TZ 环境变量

      >>> import os
      >>> import datetime
      >>> print  datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
      2019-05-17 11:26
      >>> os.environ["TZ"] = "UTC"
      >>> print  datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
      2019-05-17 09:26
      

      【讨论】:

      • timezone 适用于 Python 3。Python 2.7 已停产,您应该升级到 Python 3.8。
      • @wyz23x2 设备操作系统被锁得太紧,我根本没有其他选择。
      猜你喜欢
      • 2013-02-27
      • 2019-01-18
      • 2020-12-03
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多