2009-02-03 39 views
2

我想將一個日期字符串轉換爲一個時間。Python的時間到了

該字符串是:「星期一,2008年11月17日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) 

,但我怎麼能減去從另一個足不出戶儘管在列表中的每個項目,做手工?

回答

16

您需要使用模塊datetime和對象datetime.timedelta

from datetime import datetime 

t1 = datetime.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200") 
t2 = datetime.now() 

tdelta = t2 - t1 # actually a datetime.timedelta object 
print tdelta.days 
+0

代碼片段不正確。你需要從日期時間,而不是日期(或使用日期對象,而不是日期時間對象)導入'日期時間'。 – 2009-02-04 09:08:02

+1

如果輸入日期字符串不在本地時區中,結果不正確。你需要[我的答案](http://stackoverflow.com/a/25426694/4279)中的[知道的日期時間對象],而不是某種其他方式來跟蹤給定的UTC偏移量,例如[`email.utils.parsedate_tz()` - (http://stackoverflow.com/a/510638/4279)。 此外, `tdelta.days`可以給出令人驚訝的結果,例如, `timedelta(seconds = -5).days == -1`; `tdelta/timedelta(1)`可能是 改爲使用(或者它在舊Python版本中的模擬: `timedelta(秒= -5).total_seconds()/ 86400`)。 – jfs 2014-08-21 12:46:04

+0

如果`t1`和`t2`具有不同的UTC偏移量,例如如果`t1`是標準時間,`t2`是夏令時(`is_dst = 1`),那麼結果可能也是錯誤的。如果`t1`和`t2`位於DST轉換的相反側,就會發生](http://stackoverflow.com/a/25427822/4279)。 – jfs 2014-08-25 18:12:18

2
from datetime import datetime, timedelta 
datetime.now() 
datetime.datetime(2009, 2, 3, 15, 17, 35, 156000) 
datetime.now() - datetime(1984, 6, 29) 
datetime.timedelta(8985, 55091, 206000) 
datetime.now() - datetime(1984, 6, 29) 
datetime.timedelta(8985, 55094, 198000) # my age... 

timedelta(天[,秒[微秒[毫秒[,分鐘,小時,周]]]] ]]])

5

在Python,datetime對象本身支持減法:

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

結果是一個timedelta對象。

+0

[結果不正確,如果輸入日期字符串不在本地時區。](http://stackoverflow.com/questions/508727/python-time-to-age/25426694#comment39666382_508742) – jfs 2014-08-21 12:49:18

0

謝謝你們,我結束了以下內容:

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 
1

如果你不想使用日期時間(例如,如果你的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. 
0

因爲Python 3.2,datetime.strptime()返回如果提供%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版本@Tony Meyer's answer正確版本可用於:

#!/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) 

這兩個代碼示例都產生相同的結果。