如何将Python time.struct_time对象转换为datetime对象?

sta*_*tti 275 python datetime

如何将Python time.struct_time对象转换为datetime.datetime对象?

我有一个提供第一个库的库和第二个想要第二个库的库...

Rod*_*yde 370

使用time.mktime()将时间元组(在本地时间)转换为自Epoch以来的秒数,然后使用datetime.fromtimestamp()获取datetime对象.

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这在1900年之前失败了.现代人永远不会记住这个限制! (39认同)
  • 这会丢失`tm_isdst`数据吗?我想是这样的,即使`struct.tm_isdst`为`1`,生成的datetime对象在`.dst()`上返回`None`的程度仍然天真. (3认同)
  • 这通常会起作用。但是,如果时间元组超出mktime接受的值(例如,值(1970,1,1,0,0,0,0,1,-1)),它将失败。在解析返回此元组的HTTP请求上的Date标头之后,我遇到了此问题。 (3认同)
  • @richvdh:C标准指定`mktime()`应该考虑`tm_isdst`并且Python`time.mktime()`在CPython上调用C`mktime()`函数.如果`struct.tm_isdst`为`-1`或者`mktime(),`mktime()`可能选择错误的本地时间(例如,在DST("后退")结束时).在给定的平台上忽略*input*`tm_isdst`.此外,如果本地时区过去有不同的utc偏移量,并且C`mktime()`不使用可以提供旧的utc偏移值的历史tz数据库,则`mktime()`可能返回错误(例如,通过小时)价值也是. (3认同)
  • @Nadia为什么?您的似乎更简单,并且需要更少的模块。 (2认同)

Nad*_*mli 122

像这样:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
Run Code Online (Sandbox Code Playgroud)

  • @rodling'*`和`**`语法允许你将listy或dicty类型的对象扩展为单独的参数 - 这是我最喜欢的Python可爱之一.有关详细信息,请参阅http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists (14认同)
  • 请记住,如果struct_time有一个leapsecond,这会给你一个ValueError,例如:`t = time.strptime("1997年6月30日22:59:60","%d%b%Y%H:%M:%S "); datetime.datetime(*T [:6])` (10认同)
  • @jhwist - 有些人可以信赖他们自己搞清楚:) (7认同)
  • @berdario:返回与`datetime`兼容的值:`datetime(*t [:5] +(min(t [5],59),))``例如,接受`"2015-06-30 16:59 :60 PDT"`. (7认同)
  • 别忘了#import time,datetime (3认同)
  • 如果你已经给出了'time.struct_time`对象,则不需要@jhwist导入`time`. (2认同)

lys*_*xia 35

这不是你问题的直接答案(已经很好地回答了).然而,有几次我曾经多次咬过基础,我不能强调,你应该仔细研究你的time.struct_time对象提供什么,以及其他时间字段可能有什么.

假设您同时拥有time.struct_time对象和其他一些日期/时间字符串,请比较这两者,并确保您没有丢失数据并且无意中创建了一个天真的日期时间对象,否则您可以这样做.

例如,优秀的feedparser模块将返回"已发布"字段,并可能在其"published_pa​​rsed"字段中返回time.struct_time对象:

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)
Run Code Online (Sandbox Code Playgroud)

现在请注意"已发布"字段实际获得的内容.

Mon, 09 Sep 2013 19:57:42 -0400
Run Code Online (Sandbox Code Playgroud)

通过斯托尔曼的胡子!时区信息!

在这种情况下,懒人可能想要使用优秀的dateutil模块来保存时区信息:

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()
Run Code Online (Sandbox Code Playgroud)

这给了我们:

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00
Run Code Online (Sandbox Code Playgroud)

然后,可以使用时区感知日期时间对象将所有时间标准化为UTC或您认为很棒的任何时间.

  • 来自feedparsed的所有`*_parsed`字段已经标准化为UTC,可以在[日期解析文档]中查看(https://pythonhosted.org/feedparser/date-parsing.html?highlight=utc#supporting-additional-日期格式)所以这是多余的. (5认同)
  • @itorres:如果我理解的话,这个答案不是关于标准化 UTC,而是关于将时区信息保存在“datetime”对象中,当“feedparser”解析原始字符串日期时,该对象会丢失。 (2认同)