精通 Python datetime:日期、时间与时区实战指南
精通 Python datetime
通过实战示例与清晰讲解,学习在 Python 中处理日期和时间。
视频:Python datetime——处理日期与时间
Python datetime 模块提供强大工具操作日期和时间。下面演示常见任务,从获取当前时刻到格式化和时区处理。
示例 1:获取当前日期和时间
import datetime
datetime_object = datetime.datetime.now()
print(datetime_object)
输出类似:
2018-12-19 09:26:03.478039
此处用 import datetime 导入模块。datetime 类含 now() 方法返回本地日期时间。
示例 2:获取当前日期
import datetime
date_object = datetime.date.today()
print(date_object)
输出:
2018-12-19
用 date 类的 today() 类方法获取当前日历日期。
探索 datetime 模块
运行 dir(datetime) 列出所有属性和类:
import datetime
print(dir(datetime))
输出:
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_divide_and_round', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', 'tzinfo']
关键类包括 date、time、datetime 和 timedelta。
datetime.date 类
date 类表示日历日期(年、月、日)。
示例 3:创建日期对象
import datetime
d = datetime.date(2019, 4, 13)
print(d)
结果:
2019-04-13
date() 构造函数接受 year、month、day 参数。变量 a 为 date 实例。
仅导入 date 类:
from datetime import date
a = date(2019, 4, 13)
print(a)
示例 4:当前日期
用 today() 类方法:
from datetime import date
today = date.today()
print("Current date =", today)
示例 5:从时间戳
Unix 时间戳计算自 1970-01-01 UTC 的秒数。用 fromtimestamp() 转换:
from datetime import date
timestamp = date.fromtimestamp(1326244364)
print("Date =", timestamp)
输出:
Date = 2012-01-11
示例 6:访问年、月、日
from datetime import date
today = date.today()
print("Current year:", today.year)
print("Current month:", today.month)
print("Current day:", today.day)
datetime.time
time 类存储无日期的时钟时间。
示例 7:创建时间对象
from datetime import time
a = time()
print("a =", a)
b = time(11, 34, 56)
print("b =", b)
c = time(hour=11, minute=34, second=56)
print("c =", c)
d = time(11, 34, 56, 234566)
print("d =", d)
结果:
a = 00:00:00 b = 11:34:56 c = 11:34:56 d = 11:34:56.234566
示例 8:检查时间组件
from datetime import time
a = time(11, 34, 56)
print("hour =", a.hour)
print("minute =", a.minute)
print("second =", a.second)
print("microsecond =", a.microsecond)
输出:
hour = 11 minute = 34 second = 56 microsecond = 0
datetime.datetime
datetime 类结合日期和时间信息。
示例 9:创建 datetime 对象
from datetime import datetime
# 年、月、日
A = datetime(2018, 11, 28)
print(A)
# 完整规格
B = datetime(2017, 11, 28, 23, 55, 59, 342380)
print(B)
结果:
2018-11-28 00:00:00 2017-11-28 23:55:59.342380
年、月、日为必填;时、分、秒、微秒默认为零。
示例 10:检查组件与时间戳
from datetime import datetime
A = datetime(2017, 11, 28, 23, 55, 59, 342380)
print("year =", A.year)
print("month =", A.month)
print("day =", A.day)
print("hour =", A.hour)
print("minute =", A.minute)
print("timestamp =", A.timestamp())
输出:
year = 2017 month = 11 day = 28 hour = 23 minute = 55 timestamp = 1511913359.34238
datetime.timedelta
timedelta 对象表示两个日期或时间间的持续时间。
示例 11:日期与时间差值
from datetime import datetime, date
T1 = date(year=2018, month=7, day=12)
T2 = date(year=2017, month=12, day=23)
T3 = T1 - T2
print("T3 =", T3)
T4 = datetime(year=2018, month=7, day=12, hour=7, minute=9, second=33)
T5 = datetime(year=2019, month=6, day=10, hour=5, minute=55, second=13)
T6 = T4 - T5
print("T6 =", T6)
print("type of T3 =", type(T3))
print("type of T6 =", type(T6))
输出:
T3 = 201 days, 0:00:00 T6 = -333 days, 1:14:20 type of T3 = <class 'datetime.timedelta'> type of T6 = <class 'datetime.timedelta'>
示例 12:timedelta 对象相减
from datetime import timedelta
T1 = timedelta(weeks=2, days=5, hours=1, seconds=33)
T2 = timedelta(days=4, hours=11, minutes=4, seconds=54)
T3 = T1 - T2
print("T3 =", T3)
输出:
T3 = 14 days, 13:55:39
示例 13:负 timedelta
from datetime import timedelta
T1 = timedelta(seconds=33)
T2 = timedelta(seconds=54)
T3 = T1 - T2
print("T3 =", T3)
print("abs(T3) =", abs(T3))
输出:
T3 = -1 day, 23:59:39 abs(T3) = 0:00:21
示例 14:timedelta 总秒数
from datetime import timedelta
T = timedelta(days=5, hours=1, seconds=33, microseconds=233423)
print("total seconds =", T.total_seconds())
输出:
total seconds = 435633.233423
可对日期加减,用数字乘除 timedelta 缩放持续时间。
格式化与解析日期
不同地区用不同日期格式(如美式 mm/dd/yyyy 对英式 dd/mm/yyyy)。Python strftime() 和 strptime() 方法帮助在 datetime 对象和格式化字符串间转换。
Python strftime() —— datetime 转字符串
from datetime import datetime
now = datetime.now()
# 时:分:秒
T = now.strftime("%H:%M:%S")
print("time:", T)
# 美式格式
S1 = now.strftime("%m/%d/%Y, %H:%M:%S")
print("S1:", S1)
# 英式格式
S2 = now.strftime("%d/%m/%Y, %H:%M:%S")
print("S2:", S2)
典型输出:
time: 04:34:52 S1: 12/26/2018, 04:34:52 S2: 26/12/2018, 04:34:52
常用格式码:%Y 年、%m 月、%d 日、%H 时、%M 分、%S 秒。
Python strptime() —— 字符串转 datetime
from datetime import datetime
date_string = "21 June, 2018"
print("date_string =", date_string)
date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)
输出:
date_string = 21 June, 2018 date_object = 2018-06-21 00:00:00
此处 %d 为日、%B 全月名、%Y 年。
时区感知
需在不同时区显示或计算时间的应用,避免手动计算,使用 pytz 库。
from datetime import datetime
import pytz
local = datetime.now()
print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S"))
tz_NY = pytz.timezone('America/New_York')
dt_NY = datetime.now(tz_NY)
print("NY:", dt_NY.strftime("%m/%d/%Y, %H:%M:%S"))
tz_London = pytz.timezone('Europe/London')
dt_London = datetime.now(tz_London)
print("London:", dt_London.strftime("%m/%d/%Y, %H:%M:%S"))
示例输出:
Local: 12/20/2018, 13:10:44 NY: 12/20/2018, 08:10:44 London: 12/20/2018, 13:10:44
datetime_NY 和 datetime_London 对象包含时区感知时间戳。
Python