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)时间戳(计算机能够识别的时间)
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两位数 日期
%H24小时制 小时
%l12小时制 小时
%M分钟
%S
%a缩写英语 星期
%A全拼英语 星期
%b缩写英语 月份
%B全拼英语 月份
%cWed Dec 20 15:34:36 2023
%j年内第几天
%pPM/AM
%U星期天开始 年内第几个周
%w星期天开始 月内第几个周
%W星期一开始 年内第几个周
%x12/20/23 月/日/年
%X15: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)
0tm_year(年)2023
1tm_mon(月)1 - 12
2tm_mday(日)1 - 31
3tm_hour(时)0 - 23
4tm_min(分)0 - 59
5tm_sec(秒)0 - 60
6tm_wday(weekday)0 - 6(0表示周一)
7tm_yday(一年中的第几天)1 - 366
8tm_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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。