【问题标题】:In Python, how can I turn this format into a unix timestamp?在 Python 中,如何将这种格式转换为 unix 时间戳?
【发布时间】:2012-07-09 20:14:08
【问题描述】:
Mon Jul 09 09:20:28 +0000 2012

如果我有像这样的字符串格式,我怎样才能把它变成一个 unix 时间戳?

注意:我是从 Twitter 的 API 获得这种格式的:

https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=twitter

【问题讨论】:

  • 你需要解析它:docs.python.org/library/…
  • @Blender:OP 的格式似乎很棘手。对于+0000,他需要%z,但这会导致ValueError: 'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y'
  • 为什么 API 创建者不能坚持使用 ISO 8601? >.
  • @ThiefMaster,看起来它可以使用 Python3.2(至少是 Portable Python)。显然,这取决于您对 C 的底层实现:stackoverflow.com/questions/2609259/…

标签: python date


【解决方案1】:

最好的选择是使用dateutil.parser.parse(),它会为您提供具有正确时区信息的datetime 对象:

>>> import dateutil.parser
>>> dt = dateutil.parser.parse('Mon Jul 09 09:20:28 +0200 2012')
>>> dt
datetime.datetime(2012, 7, 9, 9, 20, 28, tzinfo=tzoffset(None, 7200))

现在您只需将其转换为 UNIX 时间戳:

>>> import time
>>> int(time.mktime(dt.timetuple()))
1341822028

您拥有的格式也可以使用email.utils.parsedate_tz 轻松解析:

>>> import datetime
>>> import email.utils
>>> parts = email.utils.parsedate_tz('Mon Jul 09 09:20:28 +0200 2012')
>>> dt = datetime.datetime(*parts[:6]) - datetime.timedelta(seconds=parts[-1])
>>> str(dt)
'2012-07-09 07:20:28'

这实际上是 Python 3.3 中 email.utils.parsedate_to_datetime 的实现方式(如果您想将其复制并粘贴到您的项目中,请将 __parsedate_tz 替换为来自 email.utilsparsedate_tz):

def parsedate_to_datetime(data):
    if not data:
        return None
    *dtuple, tz = __parsedate_tz(data)
    if tz is None:
        return datetime.datetime(*dtuple[:6])
    return datetime.datetime(*dtuple[:6],
            tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))

【讨论】:

    【解决方案2】:

    如果已知时区始终为 +0000,您可以使用:

    time.strptime('Mon Jul 09 09:20:28 +0000 2012', '%a %b %d %H:%M:%S +0000 %Y')
    

    这将返回一个日期时间结构。如果您需要自纪元以来的 unix 秒数,请运行 time.mktime(),如下所示:

    >>> time.mktime(time.strptime('Mon Jul 09 09:20:28 +0000 2012', '%a %b %d %H:%M:%S +0000 %Y'))
    1341818428.0
    

    或 time.gmtime() 如果确实时区始终是 UTC。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 那么,为什么不包括一些示例代码来实际解析他使用的格式而不会出错?
      • 那么您需要转换为 unix 时间戳...请参阅 stackoverflow.com/questions/2775864/… @thiefmaster ...我认为希望的答案足以让他到达他想去的地方并让他弄清楚它适用于其他格式
      • @JoranBeasley:请参阅我对这个问题的评论。他的格式显然不是那么易于解析。
      • 如果他删除偏移量(使用正则表达式或拆分或替换或其他)并在最后添加它(或完全忽略它......特别是如果它总是 +0000),这真的很容易/跨度>
      猜你喜欢
      • 2014-10-26
      • 2015-09-08
      • 1970-01-01
      • 2013-12-14
      • 2020-10-09
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多