1. 程式人生 > 其它 >Pyhton--日期與時間

Pyhton--日期與時間

日期和時間模組

  • time 和 calendar 模組可以用於格式化日期和時間,time模組下有很多函式可以轉換日期。
  • time.time() 返回當前時間戳 浮點數
  • localtime() 將時間戳返回 時間元組 struct_time類

time.localtime(time.time()) 輸出 time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=28, tm_sec=49, tm_wday=3, tm_yday=98, tm_isdst=0)
序號 屬性
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))))