17-[模塊]-time&datetime
1.表示時間time方式
在Python中,用三種方式來表示時間,分別是時間戳、格式化時間字符串和結構化時間
1.時間戳(timestamp):也就是1970年1月1日之後的秒, 例如1506388236.216345,可以通過time.time()獲得。時間戳是一個浮點數,可以進行加減運算,但請註意不要讓結果超出取值範圍。 2.格式化的時間字符串(string_time):也就是年月日時分秒這樣的我們常見的時間字符串, 例如2017-09-26 09:12:48,可以通過time.localtime()獲得; 3,結構化時間(struct_time):一個包含了年月日時分秒的多元元組, 例如time.struct_time(tm_year=2017, tm_mon=9, tm_mday=26, tm_hour=9, tm_min=14, tm_sec=50, tm_wday=1, tm_yday=269, tm_isdst=0),可以通過time.strftime(‘%Y-%m-%d‘)獲得。
由於Python的time模塊實現主要調用C庫,所以各個平臺可能有所不同。time模塊目前只支持到2038年前。如果需要處理範圍之外的日期,請使用datetime模塊。
UTC(Coordinated Universal Time,世界協調時),亦即格林威治天文時間,世界標準時間。我們中國為東八區,比UTC早8個小時,也就是UTC+8。關於UTC的縮寫,有個故事,你可能已經註意到了,按英文的縮寫,應該是CUT,而不是UTC。但是世界協調時在法文中的縮寫是TUC,兩國互相不讓,作為妥協,最後幹脆簡稱UTC。
DST(Daylight Saving Time)即夏令時。
2.time模塊的方法
- time.localtime([secs]):將一個時間戳轉換為當前時區的struct_time。secs參數未提供,則以當前時間為準。
- time.gmtime([secs]):和localtime()方法類似,gmtime()方法是將一個時間戳轉換為UTC時區(0時區)的struct_time。
- time.time():返回當前時間的時間戳。
- time.mktime(t):將一個struct_time轉化為時間戳。
- time.sleep(secs):線程推遲指定的時間運行。單位為秒。
- time.asctime([t]):把一個表示時間的元組或者struct_time表示為這種形式:‘Sun Oct 1 12:04:38 2017‘。如果沒有參數,將會將time.localtime()作為參數傳入。
- time.ctime([secs]):把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式。如果參數未給或者為None的時候,將會默認time.time()為參數。它的作用相當於time.asctime(time.localtime(secs))。
-
time.strftime(format[, t]):把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉化為格式化的時間字符串。如果t未指定,將傳入time.localtime()。
- 舉例:time.strftime("%Y-%m-%d %X", time.localtime()) #輸出‘2017-10-01 12:14:23‘
-
time.strptime(string[, format]):把一個格式化時間字符串轉化為struct_time。實際上它和strftime()是逆操作。
- 舉例:time.strptime(‘2017-10-3 17:54‘,"%Y-%m-%d %H:%M") #輸出 time.struct_time(tm_year=2017, tm_mon=10, tm_mday=3, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=1, tm_yday=276, tm_isdst=-1)
# time.time() 方法 :當前時間戳 In [22]: import time In [23]: time.time() Out[23]: 1518865113.717425 In [24]: time.time()/3600/24/365 Out[24]: 48.1628973505411 In [25]: time.time()/3600/24/365 + 1970 Out[25]: 2018.1628977987789
3.結構化時間
結構化時間元組共有9個元素,按順序排列如下表: 索引 屬性 取值範圍 0 tm_year(年) 比如2017 1 tm_mon(月) 1 - 12 2 tm_mday(日) 1 - 31 3 tm_hour(時) 0 - 23 4 tm_min(分) 0 - 59 5 tm_sec(秒) 0 - 61 6 tm_wday(weekday) 0 - 6(0表示周一) 7 tm_yday(一年中的第幾天) 1 - 366 8 tm_isdst(是否是夏令時) 默認為-1 既然結構化時間是一個元組,那麽就可以通過索引進行取值,也可以進行分片,或者通過屬性名獲取對應的值。
# time.localtime() 該時區 當前時間的 時間戳轉換為結構化時間 In [26]: time.localtime() Out[26]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=17, tm_w day=5, tm_yday=48, tm_isdst=0) In [27]: a = time.localtime() In [28]: a.tm_year Out[28]: 2018 In [29]: a.tm_mon Out[29]: 2 In [30]: "%s-%s-%s"%(a.tm_year,a.tm_mon,a.tm_mday) # 格式化輸出 Out[30]: ‘2018-2-17‘
# 0時區 當前時間 結構化時間 In [31]: time.gmtime() Out[31]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=11, tm_min=2, tm_sec=29, tm_wday=5, tm_yday=48, tm_isdst=0)
# 結構化轉換為時間戳 In [33]: time.mktime(a) Out[33]: 1518865175.0 In [34]: a Out[34]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0)
# 表示為這種形式:‘Sun Oct 1 12:04:38 2017‘ In [44]: time.asctime() Out[44]: ‘Sat Feb 17 19:08:53 2018‘ # 把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式 In [45]: time.ctime() Out[45]: ‘Sat Feb 17 19:09:32 2018‘ In [46]: time.ctime(123232) Out[46]: ‘Fri Jan 2 18:13:52 1970‘ In [47]: time.ctime(0) Out[47]: ‘Thu Jan 1 08:00:00 1970‘ In [48]: time.ctime(+100) Out[48]: ‘Thu Jan 1 08:01:40 1970‘ In [49]: time.ctime(+1000000) Out[49]: ‘Mon Jan 12 21:46:40 1970‘ In [50]: time.ctime(+10000000000) Out[50]: ‘Sun Nov 21 01:46:40 2286‘
4.格式化時間
格式 含義 %a 本地星期名稱的簡寫(如星期四為Thu) %A 本地星期名稱的全稱(如星期四為Thursday) %b 本地月份名稱的簡寫(如八月份為agu) %B 本地月份名稱的全稱(如八月份為august) %c 本地相應的日期和時間的字符串表示(如:15/08/27 10:20:06) %d 一個月中的第幾天(01 - 31) %f 微秒(範圍0.999999) %H 一天中的第幾個小時(24小時制,00 - 23) %I 第幾個小時(12小時制,0 - 11) %j 一年中的第幾天(001 - 366) %m 月份(01 - 12) %M 分鐘數(00 - 59) %p 本地am或者pm的標識符 %S 秒(00 - 61) %U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之 前的所有天數都放在第0周。 %w 一個星期中的第幾天(0 - 6,0是星期天) %W 和%U基本相同,不同的是%W以星期一為一個星期的開始。 %x 本地相應日期字符串(如15/08/01) %X 本地相應時間字符串(如08:08:10) %y 去掉世紀的年份(00 - 99)兩個數字表示的年份 %Y 完整的年份(4個數字表示年份) %z 與UTC時間的間隔(如果是本地時間,返回空字符串) %Z 時區的名字(如果是本地時間,返回空字符串) %% ‘%’字符
# strftime() 格式化時間 In [56]: a Out[56]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0) In [55]: time.strftime(‘%Y-%m-%d‘) Out[55]: ‘2018-02-17‘ In [57]: time.strftime(‘%Y-%m-%d %H:%M:%S‘,a) Out[57]: ‘2018-02-17 18:59:35‘ In [58]: time.strftime(‘%Y-%m-%d %H:%M:%S %A‘,a) Out[58]: ‘2018-02-17 18:59:35 Saturday‘ In [59]: time.strftime(‘%Y-%m-%d %H:%M:%S %a‘,a) Out[59]: ‘2018-02-17 18:59:35 Sat‘ In [60]: time.strftime(‘%Y-%m-%d %H:%M:%S %p‘,a) Out[60]: ‘2018-02-17 18:59:35 PM‘ In [61]: time.strftime(‘%Y-%m-%d %H:%M:%S %U‘,a) Out[61]: ‘2018-02-17 18:59:35 06‘ In [64]: time.strftime(‘%Y-%m-%d %H:%M:%S %U‘) Out[64]: ‘2018-02-17 19:14:29 06‘ In [65]: time.strftime(‘%Y-%m-%d %H:%M:%S %w‘) Out[65]: ‘2018-02-17 19:14:33 6‘ In [66]: time.strftime(‘%Y-%m-%d %H:%M:%S %W‘) Out[66]: ‘2018-02-17 19:14:36 07‘ In [67]: time.strftime(‘%Y-%m-%d %H:%M:%S %z‘) Out[67]: ‘2018-02-17 19:14:39 Öйú±ê׼ʱ¼ä‘ In [68]: time.strftime(‘%Y-%m-%d %H:%M:%S %Z‘) Out[68]: ‘2018-02-17 19:14:44 Öйú±ê׼ʱ¼ä‘
5.轉換關系
6.datetime模塊
相比於time模塊,datetime模塊的接口則更直觀、更容易調用
datetime模塊定義了下面這幾個類:
datetime.date:表示日期的類。常用的屬性有year, month, day; datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond; datetime.datetime:表示日期時間。 datetime.timedelta:表示時間間隔,即兩個時間點之間的長度。 datetime.tzinfo:與時區有關的相關信息。(這裏不詳細充分討論該類,感興趣的童鞋可以參考python手冊)
我們需要記住的方法僅以下幾個:
1.d=datetime.datetime.now() 返回當前的datetime日期類型
d.timestamp(),d.today(), d.year,d.timetuple()等方法可以調用 In [5]: datetime.datetime.now() Out[5]: datetime.datetime(2018, 2, 17, 19, 22, 27, 966803) In [9]: d.timestamp() Out[9]: 1518866577.650586 In [10]: d.today() Out[10]: datetime.datetime(2018, 2, 17, 19, 23, 17, 125420) In [11]: d.year Out[11]: 2018 In [12]: d.timetuple() Out[12]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=19, tm_min=22, tm_sec=57, tm_wday=5, tm_yday=48, tm_isdst=-1)
2.datetime.date.fromtimestamp(322222) 把一個時間戳轉為datetime日期類型
In [13]: datetime.date.fromtimestamp(3232323)
Out[13]: datetime.date(1970, 2, 7)
3.時間運算
>>> datetime.datetime.now() datetime.datetime(2017, 10, 1, 12, 53, 11, 821218) >>> datetime.datetime.now() + datetime.timedelta(4) #當前時間 +4天 datetime.datetime(2017, 10, 5, 12, 53, 35, 276589) >>> datetime.datetime.now() + datetime.timedelta(hours=4) #當前時間+4小時 datetime.datetime(2017, 10, 1, 16, 53, 42, 876275)
In [21]: datetime.datetime.now() + datetime.timedelta(years=4) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-21-764417f227f6> in <module>() ----> 1 datetime.datetime.now() + datetime.timedelta(years=4) TypeError: ‘years‘ is an invalid keyword argument for this function
4.時間替換
>>> d.replace(year=2999,month=11,day=30) datetime.date(2999, 11, 30)
17-[模塊]-time&datetime