歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python中的時間日期轉換

Python關於時間日期有兩個庫datetime和time,於是我們要在四種格式之間轉換:
datetime.datetime對象 datetime.datetime.now()
time.struct_time對象  time.localtime()
字符串 "2010-12-04T10:30:53"
時間戳 1291433453  (一般我們不關心微秒)

列一下它們的轉換方法:

Python代碼
  1. dt = datetime.datetime(2010, 12, 4, 10, 30, 53)   
  2. dt = datetime.datetime.strptime("2010-12-04T10:30:53""%Y-%m-%dT%H:%M:%S")   
  3. dt.strftime("%Y-%m-%dT%H:%M:%S")     ->   "2010-12-04T10:30:53"  
  4. 或者 dt.isoformat().split(".").pop(0)     ->   "2010-12-04T10:30:53"  
  5. dt = datetime.datetime.fromtimestamp(1291433453)   
  6. (?) dt -> 1291433453  
  7.   
  8. t = time.localtime(1291433453)   
  9. t = dt.timetuple()   
  10. t = time.strptime("2010-12-04T10:30:53""%Y-%m-%dT%H:%M:%S")   
  11. t.strftime("%Y-%m-%dT%H:%M:%S")     ->   "2010-12-04T10:30:53"  
  12. long( time.mktime(t) )  ->  1291433453  
  13. (?) t -> dt  
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對象的轉換,很容易想到通過字符串形式過渡一下:

Python代碼
  1. dt = datetime.datetime.strptime(t.strftime("%Y-%m-%dT%H:%M:%S"), "%Y-%m-%dT%H:%M:%S")  
dt = datetime.datetime.strptime(t.strftime("%Y-%m-%dT%H:%M:%S"), "%Y-%m-%dT%H:%M:%S")


更好的方式應該是這樣

Python代碼
  1. dt = datetime.datetime(*tuple(t)[:6])  
dt = datetime.datetime(*tuple(t)[:6])



對於datetime.datetime對象到時間戳的轉換,常用做法是通過time.struct_time對象過渡:

Python代碼
  1. <SPAN style="TEXT-DECORATION: line-through"><SPAN style="COLOR: #993300">long(time.mktime(dt.timetuple()))</SPAN>   
  2. </SPAN>  
long(time.mktime(dt.timetuple()))


壞處是要同時用到datetime和time兩個模塊。
其實可以在datetime內部解決,現在給一個三種格式轉為時間戳的方法:

Python代碼
  1. <SPAN style="TEXT-DECORATION: line-through"><SPAN style="COLOR: #993300">def to_timestamp(mytime, format="%Y-%m-%dT%H:%M:%S"):   
  2.     import time   
  3.     from datetime import datetime   
  4.     if isinstance(mytime, time.struct_time):   
  5.         return long(time.mktime(mytime))   
  6.     elif isinstance(mytime, str):   
  7.         mytime = datetime.strptime(mytime, format)   
  8.     if isinstance(mytime, datetime):   
  9.         #得到一個與時間戳相等的datetime.timedelta對象   
  10.         delta = mytime - datetime(1970,1,1)   
  11.         utc = delta.days * 86400L + delta.seconds   
  12.         #上面求得delta是一個localtime操作,把時區也考慮進去了,我們要還原   
  13.         return utc - 8 * 3600    
  14. </SPAN>   
  15. </SPAN>  
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 * 3600 
Python代碼
  1. long(dt.strftime("%s"))  
Copyright © Linux教程網 All Rights Reserved