python datetime 时间日期模块详解
2024年6月6日大约 6 分钟约 1900 字
[TOC]
时间类型
- UTC/GMT (Coordinated Universal Time)即格林威治天文时间,为世界标准时间。中国北京为UTC+8
- DST(Daylight Saving Time)即夏令时: 一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
- 浮点时间戳(timestamp)的方式:通常来说,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
- 元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()
- 中国时间: 全国统一采用首都北京所在的东八时区的区时作为标准时间,称为北京时间。北京时间比格林尼治时间(世界时)快8小时,即:北京时间=世界时+8小时。
time模块
time
模块与 datetime.time
类区别:
time
模块: 它提供了一系列函数来处理时间相关的任务,比如获取当前时间的时间戳、处理时间延迟等。datetime.time
类: 表示一天中的时间,没有日期的概念。
import time
# 获取当前时间戳,它是自1970年1月1日00:00:00 UTC(协调世界时)以来经过的秒数,这个时间点通常被称为Unix纪元或POSIX时间
timestamp: float = time.time() # 当前时间戳 1717645272.5199773 浮点数 (受系统时间影响)
# 让程序等待一会
time.sleep(5)
UTC(协调世界时): UTC是最广泛使用的时间标准之一,几乎所有国家的官方时间都是基于UTC的。它结合了原子时(TAI)的精确性和通过加入闰秒来与地球自转速度保持一致的调整。
1970年前和2038年后的日期无法时间戳表示。(待测试)
datetime
模块
datetime
模块是一系列类的集合:
datetime.time
类: 表示一天中的时间,没有日期的概念。datetime.date
类: 用于表示日期。它的实例包含年、月、日信息。datetime.datetime
类: 继承date
类,是date
和time
的结合,表示日期和时间。datetime.timedelta
类: 表示两个 date、time 或 datetime 实例之间的时间差。
datetime.datetime
from datetime import datetime, UTC
from zoneinfo import ZoneInfo
# 创建一个时间日期对象
dt: datetime = datetime.strptime('2024-06-06 12:30:45', '%Y-%m-%d %H:%M:%S') # 字符串导入
dt: datetime = datetime(2024, 6, 8, 12, 30, 45) # 指定日期时间
dt: datetime = datetime.fromtimestamp(1717651360.5667174) # 浮点时间戳 ——> datetime
now_dt: datetime = datetime.now() # 当前日期时间
now_utc_dt: datetime = datetime.now(UTC) # 获取UTC当前日期时间
now_dt: datetime = datetime.now(ZoneInfo("Asia/Shanghai"))
# datetime类属性
year: int = dt.year
dt.replace(year=2008) # 替换
# datetime 导出
dt_str: str = dt.strftime('%Y-%m-%d %H:%M:%S')
dt_timestamp: float = dt.timestamp() # 导出为时间戳
dt_str = dt_datetime.ctime() # datetime ——> 系统样式字符串时间
dt_str = dt_datetime.isoformat(sep=" ") # datetime ——> ISO样式字符串时间(分隔符为空格)
order: int = dt.toordinal() # 公历序数
weekday: int = dt.weekday() # 周几(0代表周日)
weekday: int = dt.isoweekday() # 周几(1代表周一)
year, week, isoweekday = dt.isocalendar() # (几年的第几周的星期几[1:星期一])
# 比较两个日期时间
if now_dt > dt:
print("现在日期时间更大")
elif now_dt < dt:
print("指定日期时间更大")
else:
print("一样大")
datetime.timedelta
from datetime import timedelta, datetime
# 加法运算符(+)
# datetime = datetime + timedelta
new_dt: datetime = datetime.now() + timedelta(days=5, hours=3, minutes=10)
# timedelta = timedelta + timedelta
new_td: timedelta = timedelta(days=5, hours=3, minutes=10) + timedelta(days=5, hours=3, minutes=10)
# 减法运算符(-)
# datetime = datetime - timedelta
new_td:datetime = datetime.now() - timedelta(days=5, hours=3, minutes=10) # 5天, 3小时, 10分钟
# timedelta = datetime - datetime
new_td: timedelta = datetime.now() - datetime.now()
# timedelta = timedelta - timedelta
new_td: timedelta = timedelta(days=5, hours=3, minutes=5) - timedelta(days=5, hours=3, minutes=10)
new_td: timedelta = abs(new_td) # 如果只关系时间差大小,可以使用abs()函数将负值转正。
# 乘法运算符(*)和除法运算符(/)
# datetime 不可以进行乘法或除法运算,timedelta可以。
# timedelta = timedelta * number
# timedelta 条件判断
if timedelta(minutes=10) > timedelta(minutes=5):
print("第一个时间差比较大")
# timedelta 导出
total_seconds = td.total_seconds() # 导出为总秒数
timedelta 计算
# 判断相等
boolean = td1 == td2 # 时间是否相等 => True
# 加减乘除
td = td1 + td2 # 加
td = td1 - td2 # 减
td = td1 * 5.5 # 乘
td = td1 / 5 # 除
int1 = td1 / td2 # 除
int1 = td1 // td2 # 商
td = td1 // 5 # 商
td = td1 % td2 # 余数
int1, td = divmod(td1, td2) # 商和余数
td = +td1 # 内存地址引用(没用)
td = -td1 # 取反
td = abs(td1) # 绝对值
str_time = str(td1) # 格式化为[D day[s], ][H]H:MM:SS[.UUUUUU]字符串 => '1 day, 0:00:00'
str_class = repr(td1) # 类名字符串
日历
import calendar
def calendar_demo():
calen_text = calendar.TextCalendar()
# 打印月历
calen_text.prmonth(2017, 5, w=0, l=0)
# 打印年历
calen_text.pryear(2017, w=2, l=1, c=6, m=3)
def calendar_func():
'''
日历相关的操作
默认星期一作为一周的第一天, 可设置
'''
# === Calendar ===
# Calendar(firstweekday=0) // Calendar对象 firstweekday:一周的第一天,0周一(默认),6周日
calen = calendar.Calendar()
calen_iter = calen.iterweekdays() # 迭代器,一周的星期数字 => 0 1 2 3 4 5 6
calen_iter = calen.itermonthdates(2017, 5) # 迭代器, x年x月中所有天 => 2017-05-01 2017-05-02 017-05-03 ...
calen_iter = calen.itermonthdays2(2017, 5) # 迭代器, x年x月中所有(日,星期) => (1, 0) (2, 1) (3, 2) ...
calen_iter = calen.itermonthdays(2017, 5) # 迭代器, x年x月中的所有天 => 1 2 3 ...
calen_iter = calen.monthdatescalendar(2017, 5) # 迭代器, x年x月中data(年,月,日)对象 => date(2017, 5, 1) date(2017, 5, 2) ...
calen_iter = calen.monthdays2calendar(2017, 5) # 迭代器, x年x月中(日,星期)的周列表 => [(1, 0), (2, 1) ...] [ ... ] ...
calen_iter = calen.monthdayscalendar(2017, 5) # 迭代器, x年x月中日的周列表 => [1,2,3 ...] [...] ...
calen_lists = calen.yeardatescalendar(2017, width=3) # x年所有data(年,月,日)对象的月列表
calen_lists = calen.yeardays2calendar(2017, width=3) # x年所有(日,星期)的月列表
calen_lists = calen.yeardayscalendar(2017, width=3) # x年所有日的月列表
# === TextCalendar ===
# TextCalendar(firstweekday=0) // 纯文本的日历
calen_text = calendar.TextCalendar()
calen_str = calen_text.formatmonth(2017, 5, w=0, l=0) # x年x月所有日
calen_text.prmonth(2017, 5, w=0, l=0) # (打印) x年x月所有日
calen_str = calen_text.formatyear(2017, w=2, l=1, c=6, m=3) # x年所有日
calen_text.pryear(2017, w=2, l=1, c=6, m=3) # (打印) x年所有日
# === HTMLCalendar ===
# HTMLCalendar(firstweekday=0) // HTML的日历
calen_html = calendar.HTMLCalendar()
calen_str = calen_html.formatmonth(2017, 5, withyear=True) # x年x月的所有日
calen_str = calen_html.formatyear(2017, width=3) # x年所有日
calen_str = calen_html.formatyearpage(2017, width=3, css='calendar.css', encoding=None) # (完整编码) x年所有日
# === calendar 模块的函数 ===
calendar.setfirstweekday(calendar.SUNDAY) # 设置每周开始的工作日(默认:0周一,6周日),如设置星期天为第一个工作日(calendar.SUNDAY) 参数:MONDAY / TUESDAY / WEDNESDAY / THURSDAY / FRIDAY / SATURDAY / SUNDAY
num = calendar.firstweekday() # 返回每周的第一天的星期
boolean = calendar.isleap(2017) # x年是否为闰年
num = calendar.leapdays(2010, 2020) # x年到y年的闰年数
num = calendar.weekday(2017, 5, 6) # x年x月x日的星期几
strs = calendar.weekheader(1) # 星期E名, 1为名字长度
weekday, days = calendar.monthrange(2017, 5) # x年x月 (星期, 月天数)
calen_lists = calendar.monthcalendar(2017, 5) # x年x月的月历
calen_lists = calendar.prmonth(2017, 5, w=0, l=0) # x年x月的日历
calen_strs = calendar.month(2017, 5, w=0, l=0) # 月历
calendar.prcal(2017, w=0, l=0, c=6, m=3) # (打印) 整年日历
calen_strs = calendar.calendar(2017, w=2, l=1, c=6, m=3) # 整年日历
time_s = calendar.timegm(time.gmtime(time.time())) # 时间元组 转为 时间戳
calen_iter = calendar.day_name # 迭代器, 星期E名称
calen_iter = calendar.day_abbr # 迭代器, 星期E缩写名称
calen_iter = calendar.month_name # 迭代器, 月E名称
calen_iter = calendar.month_abbr # 迭代器, 月E缩写名称