Python 常用模块time和datetime
2023-12-20 19:38:22
【一】python中表示时间的三种方式
import time
# 时间戳
res = time.time()
print(res, type(res))
# 1703055531.8492236 <class 'float'>
# 格式化的时间字符串
res = time.strftime('%Y-%m-%d %X')
print(res, type(res))
# 2023-12-20 14:58:51 <class 'str'>
# 结构化的时间的时间(时间元组)
res = time.struct_time('%Y-%m-%d %X')
print(res, type(res))
# time.struct_time(tm_year='%', tm_mon='Y', tm_mday='-', tm_hour='%', tm_min='m', tm_sec='-', tm_wday='%', tm_yday='d', tm_isdst=' ') <class 'time.struct_time'>
【二】time
(1)时间戳(计算机能够识别的时间)
- Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
- 时间戳在线转换网址:时间戳(Unix timestamp)转换工具
import time
# 生成时间戳
res = time.time()
print(res, type(res))
# 1703055531.8492236 <class 'float'># 生成时间戳
# 时间戳转换为时间元组(UTC时间)英国伦敦当地时间
res = time.gmtime(time.time())
print(res, type(res))
# time.struct_time(tm_year=2023, tm_mon=12, tm_mday=20, tm_hour=7, tm_min=19, tm_sec=21, tm_wday=2, tm_yday=354, tm_isdst=0) <class 'time.struct_time'>
# 时间戳转换为时间元组(北京时间)UTC时间 + 8小时 = 北京时间
res = time.localtime(time.time())
print(res, type(res))
# time.struct_time(tm_year=2023, tm_mon=12, tm_mday=20, tm_hour=15, tm_min=21, tm_sec=4, tm_wday=2, tm_yday=354, tm_isdst=0) <class 'time.struct_time'>
(2)格式化的时间字符串(人能够看懂的时间)
import time
# 输出 年-月-日
res = time.strftime("%Y-%m-%d")
print(res, type(res))
# 输出 日/月/年 时:分:秒
res = time.strftime("%x %X")
print(res, type(res))
# 2023-12-20 <class 'str'>
# 12/20/23 15:23:53 <class 'str'>
- 时间日期格式化符号
符号 | 含义 |
---|---|
%y | 两位数 年份 |
%Y | 四位数 年份 |
%m | 两位数 月份 |
%d | 两位数 日期 |
%H | 24小时制 小时 |
%l | 12小时制 小时 |
%M | 分钟 |
%S | 秒 |
%a | 缩写英语 星期 |
%A | 全拼英语 星期 |
%b | 缩写英语 月份 |
%B | 全拼英语 月份 |
%c | Wed Dec 20 15:34:36 2023 |
%j | 年内第几天 |
%p | PM/AM |
%U | 星期天开始 年内第几个周 |
%w | 星期天开始 月内第几个周 |
%W | 星期一开始 年内第几个周 |
%x | 12/20/23 月/日/年 |
%X | 15:40:22 时:分:秒 |
%Z | 中国标准时间 当前时区的名称 |
(3)时间元组(结构化时间)(用来操作的时间)
import time
# 获得当体时间 时间元组
res = time.localtime()
print(res, type(res))
# 通过“.”取值, 输出时间
print(res.tm_min, type(res.tm_min))
# 通过索引取值,输出第一个元素
print(res[0], type(res[0]))
# time.struct_time(tm_year=2023, tm_mon=12, tm_mday=20, tm_hour=15, tm_min=53, tm_sec=7, tm_wday=2, tm_yday=354, tm_isdst=0) <class 'time.struct_time'>
# 53 <class 'int'>
# 2023 <class 'int'>
- 时间元组参数
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 2023 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为0 |
(4)三种时间之间的转换方式
- 时间元组和格式化时间字符串
import time
# 格式化的时间字符串 --》 时间元组
res_tuple = time.strptime("2023-12-30","%Y-%m-%d")
print(res_tuple, type(res_tuple))
# time.struct_time(tm_year=2023, tm_mon=12, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=364, tm_isdst=-1) <class 'time.struct_time'>
# 时间元组 --》 格式化的时间字符串
res = time.strftime("%Y-%m%d", res_tuple)
print(res, type(res))
# 2023-1230 <class 'str'>
res = time.asctime(res_tuple)
print(res, type(res))
# %a %b %d %H:%M:%S %Y
# Sat Dec 30 00:00:00 2023 <class 'str'>
- 时间元组和时间戳
import time
# 时间戳 --》 时间元组
res = time.gmtime(time.time())
print(res, type(res))
res = time.localtime(time.time())
print(res, type(res))
# time.struct_time(tm_year=2023, tm_mon=12, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=364, tm_isdst=-1) <class 'time.struct_time'>
# 时间元组 --》 时间戳
res = time.mktime(res)
print(res, type(res))
# 1703031337.0 <class 'float'>
- 时间戳和格式化时间字符串
import time
res = time.ctime(time.time())
print(res, type(res))
# %a %b %d %H:%M:%S %Y
# Wed Dec 20 16:27:11 2023 <class 'str'>
【三】datetime
【1】自定义日期并格式化
import datetime
res = datetime.date(2012,12,21)
print(res, type(res))
# 2012-12-21 <class 'datetime.date'>
【2】获取本地时间
(1)年月日
import datetime
res = datetime.date.today()
print(res, type(res))
# 23-12-20 <class 'datetime.date'>
# 获取年份
print(res.year, type(res.year))
# 2023 <class 'int'>
# 获取星期 0表示周一
print(res.weekday(), type(res.weekday()))
# 2 <class 'int'>
# 获取星期 1表示周一
print(res.isoweekday(), type(res.isoweekday()))
# 3 <class 'int'>
(2)年月日时分秒
- datetime.datetime.today() 不支持传递时区参数
- datetime.datetime.now() 支持传递时区参数
- datetime.datetime.now(datetime.timezone.utc) 北京时间
- datetime.datetime.utcnow() 北京时间
import datetime
res = datetime.datetime.today()
print(res, type(res))
# 2023-12-20 16:36:38.448843 <class 'datetime.datetime'>
# 获取年份
print(res.year, type(res.year))
# 2023 <class 'int'>
# 获取星期 0表示周一
print(res.weekday(), type(res.weekday()))
# 2 <class 'int'>
# 获取星期 1表示周一
print(res.isoweekday(), type(res.isoweekday()))
# 3 <class 'int'>
【3】时间差
(1)生成时间差
import datetime
# 生成指定时间戳 两周多两天
day_delta = datetime.timedelta(weeks=2, days=2)
print(day_delta, type(day_delta))
# 16 days, 0:00:00 <class 'datetime.timedelta'>
(2)推迟时间
import datetime
day_delta = datetime.timedelta(weeks=2, days=2)
today = datetime.datetime.today()
print(f"今天日期:{today}")
print(f"16天后的日期:{today + day_delta}")
print(f"16天前的日期:{today - day_delta}")
# 今天日期:2023-12-20 16:56:58.884164
# 16天后的日期:2024-01-05 16:56:58.884164
# 16天前的日期:2023-12-04 16:56:58.884164
(3)时间差对象和时间日期对象的关系
- 时间差对象 = 时间日期对象 - 时间日期对象
- 时间日期对象 = 时间日期对象 ± 时间差对象
import datetime
day_delta = datetime.timedelta(days=1)
day_today = datetime.datetime.today()
day_last = day_today - day_delta
# 新的时间日期对象
print(day_last, type(day_last))
day_future = day_today + day_delta
print(day_future, type(day_future))
# 2023-12-19 17:10:46.187963 <class 'datetime.datetime'>
# 2023-12-21 17:10:46.187963 <class 'datetime.datetime'>
# 时间差对象
day_delta_new = day_future - day_last
print(day_delta_new, type(day_delta_new))
# 2 days, 0:00:00 <class 'datetime.timedelta'>
(4)应用
- 计算距离今天还有几天过生日
import datetime
def cal_birthday(month=1, day=1):
# 获取当天时间信息
today_info = datetime.datetime.today()
# 假设今年还没过生日
future_birthday = datetime.datetime(today_info.year, month, day)
# 计算还有几天
day_delta = future_birthday - today_info
# 如果天数小于0,那么今年已经过过了,计算距离明年的生日还有多久
if day_delta.days < 0:
future_birthday = datetime.datetime(today_info.year + 1, month, day)
day_delta = future_birthday - today_info
return day_delta
res = cal_birthday(11, 21)
print(f"还有{res.days}天{round(res.seconds / 3600)}小时,你就过生日了")
文章来源:https://blog.csdn.net/weixin_48183870/article/details/135114928
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!