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官方鏈接