Pyhton--日期與時間
阿新 • • 發佈:2022-01-16
日期和時間模組
- time 和 calendar 模組可以用於格式化日期和時間,time模組下有很多函式可以轉換日期。
- time.time() 返回當前時間戳 浮點數
- localtime() 將時間戳返回 時間元組 struct_time類
序號 | 屬性 | 值 |
---|---|---|
0 | tm_year | 2008 |
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 (60或61 是閏秒) |
6 | tm_wday | 0到6 (0是週一) |
7 | tm_yday | 一年中的第幾天,1 到 366 |
8 | tm_isdst | 是否為夏令時,值有:1(夏令時)、0(不是夏令時)、-1(未知),預設 -1 |
- time.asctime() 函式, 將時間元祖轉為簡單的可讀格式。
# localtime() 時間戳轉時間元組 time()獲取當前時間戳 localtime = time.localtime(time.time()) print(type(localtime)) # <class 'time.struct_time'> print(localtime.tm_year) # 2022 print(localtime[0]) # 2022 # mktime() 時間元組轉時間戳 mktime = time.mktime(localtime) print(mktime) #1642299718.0 # asctime() 將時間元祖轉為簡單的可讀格式 asctime = time.asctime(localtime) print(asctime) # Sat Jan 15 21:37:16 2022 # strftime() 將時間元組格式化輸出字串,不填預設當前 strftime1 = time.strftime("%Y-%m-%d %H:%M:%S", localtime) print(strftime1) # strptime() 將格式化的字串轉為時間元組 strptime1 = time.strptime("Sun Jan 16 10:06:32 2022", "%a %b %d %H:%M:%S %Y") print(strptime1) # sleep() 執行緒睡眠 time.sleep(1.5) # perf_counter() 返回系統執行時間,由於基準點未定義,只有連續呼叫的差值是有效的。 print(time.perf_counter()) # 213492.5056599 time.sleep(3.33) print(time.perf_counter()) # 213495.8365289 # process_time() 返回程序執行時間,由於基準點未定義,只有連續呼叫的差值是有效的。 print(time.process_time())
#進度條例項 scale = 50 print("執行開始".center(scale // 2, "-")) # .center() 控制輸出的樣式,寬度為 25//2,即 22,漢字居中,兩側填充 - start = time.perf_counter() # 呼叫一次 perf_counter(),從計算機系統裡隨機選一個時間點A,計算其距離當前時間點B1有多少秒。當第二次呼叫該函式時,預設從第一次呼叫的時間點A算起,距離當前時間點B2有多少秒。兩個函式取差,即實現從時間點B1到B2的計時功能。 for i in range(scale + 1): a = '*' * i # i 個長度的 * 符號 b = '.' * (scale - i) # scale-i) 個長度的 . 符號。符號 * 和 . 總長度為50 c = (i / scale) * 100 # 顯示當前進度,百分之多少 dur = time.perf_counter() - start # 計時,計算進度條走到某一百分比的用時 print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end='') # \r用來在每次輸出完成後,將游標移至行首,這樣保證進度條始終在同一行輸出,即在一行不斷重新整理的效果;{:^3.0f},輸出格式為居中,佔3位,小數點後0位,浮點型數,對應輸出的數為c;{},對應輸出的數為a;{},對應輸出的數為b;{:.2f},輸出有兩位小數的浮點數,對應輸出的數為dur;end='',用來保證不換行,不加這句預設換行。 time.sleep(0.1) # 在輸出下一個百分之幾的進度前,停止0.1秒 print("\n" + "執行結果".center(scale // 2, '-'))
- Calendar模組
- 星期一是預設的每週第一天,星期天是預設的最後一天。更改設定需呼叫calendar.setfirstweekday()函式
序號 | 函式及描述 |
---|---|
1 | calendar.calendar(year,w=2,l=1,c=6) 返回一個多行字串格式的year年年曆,3個月一行,間隔距離為c。 每日寬度間隔為w字元。每行長度為21* W+18+2* C。l是每星期行數。 |
2 | calendar.firstweekday( ) 返回當前每週起始日期的設定。預設情況下,首次載入caendar模組時返回0,即星期一。 |
3 |
calendar.isleap(year)
是閏年返回 True,否則為 false。 >>> import calendar >>> print(calendar.isleap(2000))True>>> print(calendar.isleap(1900))False |
4 | calendar.leapdays(y1,y2) 返回在Y1,Y2兩年之間的閏年總數。 |
5 | calendar.month(year,month,w=2,l=1) 返回一個多行字串格式的year年month月日曆,兩行標題,一週一行。每日寬度間隔為w字元。每行的長度為7* w+6。l是每星期的行數。 |
6 | calendar.monthcalendar(year,month) 返回一個整數的單層巢狀列表。每個子列表裝載代表一個星期的整數。Year年month月外的日期都設為0;範圍內的日子都由該月第幾日表示,從1開始。 |
7 |
calendar.monthrange(year,month)
返回兩個整數。第一個是該月的星期幾,第二個是該月有幾天。星期幾是從0(星期一)到 6(星期日)。 >>> import calendar >>> calendar.monthrange(2014, 11)(5, 30)(5, 30)解釋:5 表示 2014 年 11 月份的第一天是週六,30 表示 2014 年 11 月份總共有 30 天。 |
8 | calendar.prcal(year, w=0, l=0, c=6, m=3) 相當於 print (calendar.calendar(year, w=0, l=0, c=6, m=3))。 |
9 | calendar.prmonth(theyear, themonth, w=0, l=0) 相當於print(calendar.month(theyear, themonth, w=0, l=0))。 |
10 | calendar.setfirstweekday(weekday) 設定每週的起始日期碼。0(星期一)到6(星期日)。 |
11 | calendar.timegm(tupletime) 和time.gmtime相反:接受一個時間元組形式,返回該時刻的時間戳(1970紀元後經過的浮點秒數)。 |
12 | calendar.weekday(year,month,day) 返回給定日期的日期碼。0(星期一)到6(星期日)。月份為 1(一月) 到 12(12月)。 |
- datetime模組
- 注意到datetime是模組,datetime模組還包含一個datetime類,通過from datetime import datetime匯入的才是datetime這個類。
-
如果僅匯入import datetime,則必須引用全名datetime.datetime。
-
建立datetime物件,now() utcnow()或者datetime(),datetime.now()返回當前日期和時間,其型別是datetime物件。或者datetime(2022,1,14,12,55)
-
將datetime物件轉時間戳,datetime.timestamp(dt) 或 dt.timestamp()
-
fromtimestamp() utcfromtimestamp() 時間戳轉datetime物件,預設本地時間時區
-
strptime() 將格式化字元轉為datetime物件,轉換沒有時區
-
datetime加減得到新的datetime物件,需匯入timedelta類
-
#時區轉換,一個datetime型別有一個時區屬性tzinfo,但是預設為None,所以無法區分這個datetime到底是哪個時區,除非強行給datetime設定一個時區
-
#時區轉換的關鍵在於,拿到一個datetime時,要獲知其正確的時區,然後強制設定時區,作為基準時間。
-
#利用帶時區的datetime,通過astimezone()方法,可以轉換到任意時區。
-
如果要儲存datetime,最佳方法是將其轉換為timestamp再儲存,因為timestamp的值與時區完全無關
-
astimezone() 進行時區轉換
now = datetime.now() print(now) print(type(now)) #<class 'datetime.datetime'> dt = datetime(2022,1,14,11,55) #構造一個datetime物件,時區不設定預設None本地時間 print(dt) print(type(dt)) #<class 'datetime.datetime'> # timestamp() 轉時間戳 ts = dt.timestamp() print(datetime.timestamp(dt)) print(ts) # fromtimestamp() utcfromtimestamp() 時間戳轉datetime物件,預設本地時間時區 print(datetime.fromtimestamp(ts)) print(datetime.utcfromtimestamp(ts)) # strptime() 將格式化字元轉為datetime物件,轉換沒有時區 print(datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S')) # strftime() 將datetime物件轉為格式化字串 print(dt.strftime("%Y--%m--%d %H:%M:%S")) # datetime加減得到新的datetime物件,需匯入timedelta類, print(dt + timedelta(hours=7)) print(dt - timedelta(days=2,hours=6)) #時區轉換,一個datetime型別有一個時區屬性tzinfo,但是預設為None,所以無法區分這個datetime到底是哪個時區,除非強行給datetime設定一個時區 #時區轉換的關鍵在於,拿到一個datetime時,要獲知其正確的時區,然後強制設定時區,作為基準時間。 #利用帶時區的datetime,通過astimezone()方法,可以轉換到任意時區。 # 建立一個時區 tz_utc_8 = timezone(timedelta(hours=8)) # 強制設定時區為utf8,如果系統時間正確才可以這樣設定 print(datetime.now().replace(tzinfo=tz_utc_8)) # 拿到UTC時間,並強制設定時區為UTC+0:00: utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) # astimezone() 進行時區轉換 print(utc_dt.astimezone(timezone(timedelta(hours=8)))) print(utc_dt.astimezone(timezone(timedelta(hours=9)))) print(utc_dt.astimezone(timezone(timedelta(hours=4))))