1. 程式人生 > >17-[模塊]-time&datetime

17-[模塊]-time&datetime

它的 rom error 年份 方式 argument class trac today

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