(十二)Python中級知識-時間模塊之time與datetime

1、概述

Python 提供了 time、datetime模塊用於時間相關的處理,如獲取當前系統時間,時間格式化,時區識別等操作。
本文采用幾個問題的方式進行描述,主要是一些常用的場景。
使用之前,先導入我們需要使用的這兩個模塊。


from datetime import datetime
from time import time

2、time.struct_time元組類型

舉個對應數據類型的例子:

time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)

是一個元組,與java類比的話可以理解成java.util.Date類,能獲取毫秒數,獲取年、月、日、時分秒等,有了這樣一組數據結構之後我們就可以集中表示時間了。

gmtime() 、 localtime()strptime() 三個方法可以返回這個元組類型。

time.struct_time是一個帶有 named tuple 接口的對象:可以通過索引和屬性名訪問值。這個元組結構裏面包含的屬性與值的描述信息,列舉如下:

索引 屬性
0 tm_year (例如,1993)
1 tm_mon range [1, 12]
2 tm_mday range [1, 31]
3 tm_hour range [0, 23]
4 tm_min range [0, 59]
5 tm_sec range [0, 61]; 見 strftime() 介紹中的 (2)
6 tm_wday range [0, 6] ,週一爲 0
7 tm_yday range [1, 366]
8 tm_isdst 0, 1 或 -1;如下所示
9 tm_zone 時區名稱的縮寫
10 tm_gmtoff 以秒爲單位的UTC以東偏離

3、如何獲取當前系統時間?

time和datetime都可以獲取當前時間,但是輸出格式是不同的。

舉個例子:
import datetime
# 普通的時間格式化操作
import time

print("time獲取當前時間:", time.time())
print("datetime獲取當前時間:", datetime.datetime.now())
print("time獲取當前一個可讀的時間格式,是英文的:", time.asctime())
輸出結果:
time獲取當前時間: 1584086327.549221
datetime獲取當前時間: 2020-03-13 15:58:47.549221
time獲取當前一個可讀的時間格式,是英文的: Fri Mar 13 15:58:47 2020

我們在實際項目中大都會再次進行格式化,處理爲我們更容易理解的時間格式。

4、如何獲取當前系統時區?

時區應用場景可能會在跨國家等地方用到,比如國內主要使用的時區是北京(東八區),國外如:東京(東九區)、倫敦(中時區)、紐約(西五區);

舉個例子:
# 普通的時間格式化操作
import time

print("格林威治標準下的時區:", time.strftime("%z", time.gmtime()))
print("當地的時區:", time.strftime("%z", time.localtime()))
輸出結果:
格林威治標準下的時區: +0800
當地的時區: +0800

關於時區可以看本文結尾處的參考資料。

5、如何格式化時間?

格式化時間一般是針對struct_time元組轉字符串,字符串轉struct_time元組等操作。

舉個例子:
# 普通的時間格式化操作
import time

# 包含有對時區的操作
import datetime
# 普通的時間格式化操作
import time

print("獲取當前時區下的時間struct_time元組:", time.localtime())
print("struct_time元組轉字符串:", time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()))
print("字符串轉struct_time元組:", time.strptime("2020-03-13 12:13:55","%Y-%m-%d %H:%M:%S"))

關鍵函數:strftime與strptime注意兩個函數一字之差。

輸出結果:
獲取當前時區下的時間struct_time元組: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=4, tm_sec=27, tm_wday=4, tm_yday=73, tm_isdst=0)
struct_time元組轉字符串: 2020-03-13 08:04:27
字符串轉struct_time元組: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)

從例子中我們看到 字符串轉換過程我們看到有%Y-%m-%d %H:%M:%S 類似的格式化符號,這個與Java中的"yyyy-MM-dd HH:mm:ss"格式化符號有一定的區別。

在Python3中格式化符合的描述信息,如下表所示:

序號 指令 意義
1 %a 本地化的縮寫星期中每日的名稱。
2 %A 本地化的星期中每日的完整名稱。
3 %b 本地化的月縮寫名稱。
4 %B 本地化的月完整名稱。
5 %c 本地化的適當日期和時間表示。
6 %j 十進制數 [001,366] 表示的年中日。
7 %y 十進制數 [00,99] 表示的沒有世紀的年份。如19、20
8 %Y 十進制數表示的帶世紀的年份。如2019、2020
9 %m 十進制數 [01,12] 表示的月。
10 %d 十進制數 [01,31] 表示的月中日。如01、02
11 %H 十進制數 [00,23] 表示的小時(24小時制)。
12 %I 十進制數 [01,12] 表示的小時(12小時制)。
13 %M 十進制數 [00,59] 表示的分鐘。
14 %p 本地化的 AM 或 PM 。
15 %S 十進制數 [00,61] 表示的秒。
16 %U 十進制數 [00,53] 表示的一年中的週數(星期日作爲一週的第一天)作爲。在第一個星期日之前的新年中的所有日子都被認爲是在第0周。
17 %w 十進制數 [0(星期日),6] 表示的週中日。
18 %W 十進制數 [00,53] 表示的一年中的週數(星期一作爲一週的第一天)作爲。在第一個星期一之前的新年中的所有日子被認爲是在第0周。
19 %x 本地化的適當日期表示。
20 %X 本地化的適當時間表示。
21 %z 時區偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或負時差指示,其中H表示十進制小時數字,M表示小數分鐘數字 [-23:59, +23:59] 。可以輸出時區
22 %Z 時區名稱(如果不存在時區,則不包含字符)。
23 %% 字面的 ‘%’ 字符。

# 6、完整代碼

import datetime
import time

print("time獲取當前時間:", time.time())
print("datetime獲取當前時間:", datetime.datetime.now())
print("time獲取當前一個可讀的時間格式,是英文的:", time.asctime())
print("========格式化與轉換=========")
print("獲取當前時區下的時間struct_time元組:", time.localtime())
print("struct_time元組轉字符串:", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))
print("字符串轉struct_time元組:", time.strptime("2020-03-13 12:13:55", "%Y-%m-%d %H:%M:%S"))
print("=========獲取時區========")
print("格林威治標準下的時區:", time.strftime("%z", time.gmtime()))
print("當地的時區:", time.strftime("%z", time.localtime()))

輸出:
time獲取當前時間: 1584087845.7794068
datetime獲取當前時間: 2020-03-13 16:24:05.779406
time獲取當前一個可讀的時間格式,是英文的: Fri Mar 13 16:24:05 2020
========格式化與轉換=========
獲取當前時區下的時間struct_time元組: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=24, tm_sec=5, tm_wday=4, tm_yday=73, tm_isdst=0)
struct_time元組轉字符串: 2020-03-13 08:24:05
字符串轉struct_time元組: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)
=========獲取時區========
格林威治標準下的時區: +0800
當地的時區: +0800

7、總結

struct_time元組類型,這是可以當成java中的Date類來理解,就是一種數據結構。
時間格式化符號需要掌握一些常用的,如文中標黃的一些,可以重點關注,其餘的可以在實踐中回查。
datetime 沒有更多的進行實踐,可以參看文章結尾的鏈接,進行更深入的學習。

參考資料:
[1]、百度百科-時區
[2]、維基百科-時區
[3]、datetime官方鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章