Python關於時間日期有兩個庫datetime和time,於是我們要在四種格式之間轉換:
datetime.datetime對象 datetime.datetime.now()
time.struct_time對象 time.localtime()
字符串 "2010-12-04T10:30:53"
時間戳 1291433453 (一般我們不關心微秒)
列一下它們的轉換方法:
dt = datetime.datetime(2010, 12, 4, 10, 30, 53) dt = datetime.datetime.strptime("2010-12-04T10:30:53", "%Y-%m-%dT%H:%M:%S") dt.strftime("%Y-%m-%dT%H:%M:%S") -> "2010-12-04T10:30:53" 或者 dt.isoformat().split(".").pop(0) -> "2010-12-04T10:30:53" dt = datetime.datetime.fromtimestamp(1291433453) (?) dt -> 1291433453 t = time.localtime(1291433453) t = dt.timetuple() t = time.strptime("2010-12-04T10:30:53", "%Y-%m-%dT%H:%M:%S") t.strftime("%Y-%m-%dT%H:%M:%S") -> "2010-12-04T10:30:53" long( time.mktime(t) ) -> 1291433453 (?) t -> dt
可以看出,Python沒有提供直接的time.struct_time對象到datetime.datetime對象的轉換,也沒有直接提供datetime.datetime對象到時間戳的轉換。另外,Python的兩個strftime ,strptime中都沒有時間戳的格式化符號。
對time.struct_time對象到datetime.datetime對象的轉換,很容易想到通過字符串形式過渡一下:
dt = datetime.datetime.strptime(t.strftime("%Y-%m-%dT%H:%M:%S"), "%Y-%m-%dT%H:%M:%S")
更好的方式應該是這樣
dt = datetime.datetime(*tuple(t)[:6])
對於datetime.datetime對象到時間戳的轉換,常用做法是通過time.struct_time對象過渡:
long(time.mktime(dt.timetuple()))
壞處是要同時用到datetime和time兩個模塊。
其實可以在datetime內部解決,現在給一個三種格式轉為時間戳的方法:
def to_timestamp(mytime, format="%Y-%m-%dT%H:%M:%S"): import time from datetime import datetime if isinstance(mytime, time.struct_time): return long(time.mktime(mytime)) elif isinstance(mytime, str): mytime = datetime.strptime(mytime, format) if isinstance(mytime, datetime): #得到一個與時間戳相等的datetime.timedelta對象 delta = mytime - datetime(1970,1,1) utc = delta.days * 86400L + delta.seconds #上面求得delta是一個localtime操作,把時區也考慮進去了,我們要還原 return utc - 8 * 3600Python代碼