Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python时代_Python_Datetime - Fatal编程技术网

Python时代

Python时代,python,datetime,Python,Datetime,我正在尝试将日期字符串转换为年龄 字符串类似于:“Mon,Nov 2008 01:45:32+0200”,我需要计算它有多少天了 我已使用以下方法成功转换日期: >>> time.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200") (2008, 11, 17, 1, 45, 32, 0, 322, -1) 由于某种原因%z为+0200提供了一个错误,但这并不重要 我可以使用以下方法

我正在尝试将日期字符串转换为年龄

字符串类似于:“Mon,Nov 2008 01:45:32+0200”,我需要计算它有多少天了

我已使用以下方法成功转换日期:

>>> time.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200")
(2008, 11, 17, 1, 45, 32, 0, 322, -1)
由于某种原因%z为+0200提供了一个错误,但这并不重要

我可以使用以下方法获取当前时间:

>>> time.localtime()
(2009, 2, 3, 19, 55, 32, 1, 34, 0)

但是我如何才能从另一项中减去一项,而不必遍历列表中的每一项并手动执行它呢?

您需要使用模块
datetime
和对象


timedelta(天[、秒[、微秒[、毫秒[、分钟[、小时[、周]]]

在Python中,
datetime
对象本机支持减法:

from datetime import datetime
age = datetime.now() - datetime.strptime(...)
print age.days

结果是一个对象。

谢谢大家,我最终得到了以下结果:

def getAge( d ):
    """ Calculate age from date """
    delta = datetime.now() - datetime.strptime(d, "%a, %d %b %Y %H:%M:%S +0200")
    return delta.days + delta.seconds / 86400.0 # divide secs into days
给予:

>>> getAge("Mon, 17 Nov 2008 01:45:32 +0200")
78.801319444444445

如果您不想使用datetime(例如,如果您的Python很旧,并且您没有该模块),您可以只使用时间模块

s = "Mon, 17 Nov 2008 01:45:32 +0200"
import time
import email.utils # Using email.utils means we can handle the timezone.
t = email.utils.parsedate_tz(s) # Gets the time.mktime 9-tuple, plus tz
d = time.time() - time.mktime(t[:9]) + t[9] # Gives the difference in seconds.

自Python 3.2以来,
datetime.strtime()
如果提供了
%z
指令,则返回一个可感知的datetime对象:

#!/usr/bin/env python3
from datetime import datetime, timezone, timedelta

s = "Mon, 17 Nov 2008 01:45:32 +0200"
birthday = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z')
age = (datetime.now(timezone.utc) - birthday) / timedelta(1) # age in days
print("%.0f" % age)
在较旧的Python版本上,可以使用的正确版本为:

#!/usr/bin/env python
import time
from email.utils import parsedate_tz, mktime_tz

s = "Mon, 17 Nov 2008 01:45:32 +0200"
ts = mktime_tz(parsedate_tz(s))   # seconds since Epoch
age = (time.time() - ts) / 86400  # age in days
print("%.0f" % age)

两个代码示例产生相同的结果。

由于闰年(和秒)的原因,这不能保证是正确的。datetime模块知道闰年。它可能也知道闰秒,但当OP关心以天为单位的时间时,这似乎并不重要。看起来他关心以年为单位的时间。函数返回天数。它对于我所需要的东西是否超级准确并不重要。谢谢!:)代码段不正确。您需要从datetime而不是date导入“datetime”(或使用date对象,而不是datetime对象)。如果输入的日期字符串不在本地时区中,则结果不正确。您需要相反的方式或其他方式来跟踪给定的UTC偏移量,例如。另外,
tdelta.days
可能会给出令人惊讶的结果,例如,
timedelta(秒=-5)。days=-1
tdelta/timedelta(1)
可以替代使用(或者在较旧的Python版本上使用它的模拟值:
timedelta(seconds=-5)。total_seconds()/86400
)。如果
t1
t2
具有不同的UTC偏移量,则结果也可能是错误的,例如,如果
t1
是标准时间而
t2
是夏季时间(
is_dst=1
)--请参阅.1了解parsedate。尽管由于
+t[9]
,您的代码生成了错误的结果,
#!/usr/bin/env python3
from datetime import datetime, timezone, timedelta

s = "Mon, 17 Nov 2008 01:45:32 +0200"
birthday = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z')
age = (datetime.now(timezone.utc) - birthday) / timedelta(1) # age in days
print("%.0f" % age)
#!/usr/bin/env python
import time
from email.utils import parsedate_tz, mktime_tz

s = "Mon, 17 Nov 2008 01:45:32 +0200"
ts = mktime_tz(parsedate_tz(s))   # seconds since Epoch
age = (time.time() - ts) / 86400  # age in days
print("%.0f" % age)