iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

跟著 OXXO 一起學 Python系列 第 39

( Day 19.1 ) Python 日期和時間 datetime

  • 分享至 

  • xImage
  •  

Python 的標準函式「datetime」提供不少處理日期和時間的方法,可以取得目前的日期或時間,並進一步進行相關的運算。

原文參考:日期和時間 datetime

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

datatime 常用方法

datatime 有下列幾種處理日期和時間的方法 ( 參考 Python 官方文件:datatime ):

方法 說明
date 處理日期
time 處理時間
datetime 處理 date 和 time 混合的物件
timedelta 處理時間差
timezone 處理時區資訊

import datatime

要使用 datatime 必須先 import datatime 模組,或使用 from 的方式,單獨 import 特定的類型。

import datatime
from datatime import date

date

datetime.date 可以處理日期相關的操作,本身包含三個屬性:year、month 和 day,分別用逗號區隔,下方的程式會印出指定的日期。

import datetime
d = datetime.date(2020,1,1)   # 2020-01-01

datetime.date 有一個主要的方法可以使用,下方的程式執行了 today() 的方法,印出今天的日期 ( 使用 ISO 格式的日期字串 )。

方法 說明
today() 回傳目前的西元年、月、日
import datetime
today = datetime.date.today()
print(today)     # 2021-10-19

取得日期後,可以使用下面幾種常用的方法,進一步取出日期的資訊進行操作。

方法 說明
year 取得西元年
month 取得月份
day 取得日期
replace() 取代日期,產生新的物件
weekday() 回傳一星期中的第幾天,星期一為 0
isoweekday() 回傳一星期中的第幾天,星期一為 1
isocalendar() 回傳一個 tuple,內容分別是 ( 年、第幾週、isoweekday )
isoformat() 回傳 ISO 格式的日期字串
ctime() 回傳日期和時間的字串
strftime() 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() )
import datetime
today = datetime.date.today()
print(today)                 # 2021-10-19
print(today.year)            # 2021
print(today.month)           # 10
print(today.day)             # 19
print(today.weekday())       # 1    ( 因為是星期二,所以是 1 )
print(today.isoweekday())    # 2    ( 因為是星期二,所以是 2 )
print(today.isocalendar())   # (2021, 42, 2)  ( 第三個數字是星期二,所以是 2 )
print(today.isoformat())     # 2021-10-19
print(today.ctime())         # Tue Oct 19 00:00:00 2021
print(today.strftime('%Y.%m.%d'))    # 2021.10.19

newDay = today.replace(year=2020)
print(newDay)                # 2020-10-19

下方的程式執行後,會利用「.days」的屬性,計算出兩個日期差了幾天。

import datetime
d1 = datetime.date(2020, 6, 24)
d2 = datetime.date(2021, 11, 24)
print(abs(d1-d2).days)       # 518

time

datetime.time 可以處理時間相關的操作,本身包含下列幾個屬性:hour、minute、second、microsecond 和 tzinfo,分別用逗號區隔,下方的程式會印出指定的時間。

import datetime
thisTime = datetime.time(12,0,0,1)
print(thisTime)   # 12:00:00.000001

tzinfo 是時區的選項,預設 None 採用 UTC 時區,如果要轉換成台灣 UTC+8 的時區可採用下方的寫法:

import datetime
thisTime = datetime.time(14,0,0,1,tzinfo=datetime.timezone(datetime.timedelta(hours=8)))
print(thisTime)    # 14:00:00.000001+08:00

使用 datetime.time 將字串轉換為時間物件後,就能透過下面幾種常用的方法,取出時間的資訊進行下一步操作。

方法 說明
hour 取得小時
minute 取得分鐘
second 取得秒數
microsecond 取得微秒數 (1/1000000 秒)
replace() 取代時間,產生新的物件
isoformat() 回傳 ISO 格式的時間字串
tzname() 回傳目前時區資訊
strftime() 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() )
import datetime
thisTime = datetime.time(14,0,0,1,tzinfo=datetime.timezone(datetime.timedelta(hours=8)))
print(thisTime)               # 14:00:00.000001+08:00
print(thisTime.isoformat())   # 14:00:00.000001+08:00
print(thisTime.tzname())      # UTC+08:00
print( thisTime.strftime('%H:%M:%S'))   # 14:00:00

newTime = today.replace(hour=20)
print(newTime)                # 20:00:00.000001+08:00

datetime

datetime.datetime 可以處理日期與時間相關的操作,本身包含下列幾個屬性:year、month、dayhour、minute、second、microsecond 和 tzinfo,分別用逗號區隔,下方的程式會印出指定的日期和時間。

import datetime
thisTime = datetime.datetime(2020,1,1,20,20,20,20)
print(thisTime)    # 2020-01-01 20:20:20.000020

datetime.datetime 有下面幾個主要的方法可以使用:

方法 說明
today() 回傳目前的日期與時間
now() 回傳目前的日期與時間,可加入 tz 參數設定時區
utcnow() 回傳目前的日期與時間
import datetime
print(datetime.datetime.today())    # 2021-10-19 06:15:46.022925
print(datetime.datetime.now(tz=datetime.timezone(datetime.timedelta(hours=8))))
# 2021-10-19 14:15:46.027982+08:00
print(datetime.datetime.utcnow())   # 2021-10-19 06:15:46.028630

使用 datetime.datetime 將字串轉換為日期時間物件後,就能透過下面幾種常用的方法,將取出的日期時間資訊進行下一步操作。

方法 說明
year 取得西元年
month 取得月份
day 取得日期
hour 取得小時
minute 取得分鐘
second 取得秒數
microsecond 取得微秒數 (1/1000000 秒)
weekday() 回傳一星期中的第幾天,星期一為 0
isoweekday() 回傳一星期中的第幾天,星期一為 1
isocalendar() 回傳一個 tuple,內容分別是 ( 年、第幾週、isoweekday )
isoformat() 回傳 ISO 格式的日期字串
ctime() 回傳日期和時間的字串
timetuple() 回傳日期與時間所組成的 time.struct_time 物件
strftime() 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() )
import datetime
now = datetime.datetime.now(tz=datetime.timezone(datetime.timedelta(hours=8)))
print(now)                # 2021-10-19 14:25:46.962975+08:00
print(now.date())         # 2021-10-19
print(now.time())         # 14:25:46.962975
print(now.tzname())       # UTC+08:00
print(now.weekday())      # 1
print(now.isoweekday())   # 2
print(now.isocalendar())  # (2021, 42, 2)
print(now.isoformat())    # 2021-10-19 14:25:46.962975+08:00
print(now.ctime())        # Tue Oct 19 14:48:38 2021
print(now.strftime('%Y/%m/%d %H:%M:%S'))  # 2021/10/19 14:48:38
print(now.timetuple())    # time.struct_time(tm_year=2021, tm_mon=10, tm_mday=19, tm_hour=16, tm_min=8, tm_sec=6, tm_wday=1, tm_yday=292, tm_isdst=-1)

timedelta

如果要進行日期或時間的計算,可以透過 datetime.timedelta 增加或減少日期或時間,本身包含 days、seconds、microseconds、milliseconds、minutes、hours、weeks 的屬性,屬性的預設值都是 0。

使用 datetime.timedelta 只需要將其放在日期或時間物件後方,就回傳計算後的時間,下方的程式會計算出昨天、明天、下星期同一天的日期。

import datetime
today = datetime.datetime.now()
yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1)
nextweek = today + datetime.timedelta(weeks=1)
print(today)       # 2021-10-19 07:01:22.669886
print(yesterday)   # 2021-10-18 07:01:22.669886
print(tomorrow)    # 2021-10-20 07:01:22.669886
print(nextweek)    # 2021-10-26 07:01:22.669886

timezone

datetime.timezone 負責時區的轉換,主要和 datetime.datetime、datetime.time 互相搭配使用。

datetime.timedelta 裡 hours 的數值,可以參考:時區列表,台灣處在 GMT+8 的時區,所以 hours 等於 8,如果是日本,因為是 GTM+9,hours 就要設定為 9。

import datetime
tzone = datetime.timezone(datetime.timedelta(hours=8))
now = datetime.datetime.now(tz=tzone)
print(now)    # 2021-10-19 15:07:51.128092+08:00

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 18.3 ) Python 隨機數 random
下一篇
( Day 19.2 ) Python 時間處理 time
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言