【问题标题】:Comparing dates in Python - how to handle time zone modifiers比较 Python 中的日期 - 如何处理时区修饰符
【发布时间】:2013-02-04 05:19:45
【问题描述】:

我在做 Python 日期比较:

假设我有这样的约会:'Fri Aug 17 12:34:00 2012 +0000'

我是这样解析的:

dt=datetime.strptime('Fri Aug 17 12:34:00 2012 +0000', '%a %b %d %H:%M:%S %Y +0000')

我在文档页面上找不到如何处理剩余的+0000? 我想要一个比硬编码值更通用的解决方案。

也许这很容易,有什么提示吗?

【问题讨论】:

    标签: python date datetime python-2.7


    【解决方案1】:

    默认的datetime 模块不能很好地处理时区;超出您当前的机器时区和 UTC,它们基本上不受支持。

    您必须为此使用外部库或手动处理时区偏移量。

    外部库选项:

    • 使用dateutil.parser 可以处理您想扔给它的任何日期和/或时间格式:

      from dateutil import parser
      
      dt = parser.parse(s)
      
    • iso8601 library 仅处理 ISO 8601 格式,其中包括相同格式的时区偏移:

      import iso8601
      datetimetext, tz = s.rsplit(None, 1)  # only grab the timezone portion.
      timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
      dt = datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
      

    每种方法的演示:

    >>> import datetime
    >>> s = 'Fri Aug 17 12:34:00 2012 +0000'
    >>> import iso8601
    >>> timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
    >>> datetime.datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
    datetime.datetime(2012, 8, 17, 12, 34, tzinfo=<FixedOffset '+00:00'>)
    >>> from dateutil import parser
    >>> parser.parse(s)
    datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc())
    

    【讨论】:

    • 感谢分享,这正是我需要的。
    【解决方案2】:

    使用dateutil.parser

    >>> import dateutil.parser
    >>> dateutil.parser.parse('Fri Aug 17 12:34:00 2012 +0000')
    >>> datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc())
    

    【讨论】:

      【解决方案3】:

      您可能还想看看Delorean。它是 pytzdateutil 的包装器,它提供时区操作以及简单的日期时间时区转换。

      以下是我将如何使用 Delorean 解决您的问题。

      >>> from delorean import parse
      >>> parse("2011/01/01 00:00:00 -0700")
      Delorean(datetime=2011-01-01 07:00:00+00:00, timezone=UTC)
      

      从那里您可以通过简单地返回.datetime 属性来返回日期时间。如果您想进行一些时间转换,只需使用 Delorean 对象并执行 .shift("UTC") 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 2018-03-08
        相关资源
        最近更新 更多