时间与日期 datetime
Python 的标准函数“datetime”提供不少处理日期和时间的方法,可以取得目前的日期或时间,并进一步进行相关的运算。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
datetime 常用方法
datetime 有下列几种处理日期和时间的方法 ( 参考 Python 官方文件:datetime ):
| 方法 | 说明 |
|---|---|
| date | 处理日期 |
| time | 处理时间 |
| datetime | 处理 date 和 time 混合的对象 |
| timedelta | 处理时间差 |
| timezone | 处理时区信息 |
import datetime
要使用 datetime 必须先 import datetime 模组,或使用 from 的方式,单独 import 特定的类型。
import datetime
from datetime 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
微信扫码关注
抖音扫码关注