Python 常用模块time和datetime

【一】python中表示时间的三种方式

import time

# 时间戳
res = time.time()
print(res, type(res))
# 1703055531.8492236 

# 格式化的时间字符串
res = time.strftime('%Y-%m-%d %X')
print(res, type(res))
# 2023-12-20 14:58:51 

# 结构化的时间的时间(时间元组)
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=' ') 

【二】time

(1)时间戳(计算机能够识别的时间)
  • Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
  • 时间戳在线转换网址:时间戳(Unix timestamp)转换工具
import time

# 生成时间戳
res = time.time()
print(res, type(res))
# 1703055531.8492236 # 生成时间戳

# 时间戳转换为时间元组(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) 

# 时间戳转换为时间元组(北京时间)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) 
(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 
# 12/20/23 15:23:53 
  • 时间日期格式化符号
符号 含义
%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) 
# 53 
# 2023 
  • 时间元组参数
索引(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)三种时间之间的转换方式

Python 常用模块time和datetime_第1张图片

  • 时间元组和格式化时间字符串
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) 

# 时间元组  --》  格式化的时间字符串
res = time.strftime("%Y-%m%d", res_tuple)
print(res, type(res))
# 2023-1230 
res = time.asctime(res_tuple)
print(res, type(res))
# %a %b %d %H:%M:%S %Y
# Sat Dec 30 00:00:00 2023 
  • 时间元组和时间戳
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) 

# 时间元组  --》  时间戳
res = time.mktime(res)
print(res, type(res))
# 1703031337.0 

  • 时间戳和格式化时间字符串
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 

【三】datetime

【1】自定义日期并格式化

import datetime

res = datetime.date(2012,12,21)
print(res, type(res))
# 2012-12-21 

【2】获取本地时间

(1)年月日
import datetime

res = datetime.date.today()
print(res, type(res))
# 23-12-20 
# 获取年份
print(res.year, type(res.year))
# 2023 
# 获取星期 0表示周一
print(res.weekday(), type(res.weekday()))
# 2 
# 获取星期 1表示周一
print(res.isoweekday(), type(res.isoweekday()))
# 3 
(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 
# 获取年份
print(res.year, type(res.year))
# 2023 
# 获取星期 0表示周一
print(res.weekday(), type(res.weekday()))
# 2 
# 获取星期 1表示周一
print(res.isoweekday(), type(res.isoweekday()))
# 3 

【3】时间差

(1)生成时间差
import datetime
# 生成指定时间戳 两周多两天
day_delta = datetime.timedelta(weeks=2, days=2)
print(day_delta, type(day_delta))
# 16 days, 0:00:00 
(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 
# 2023-12-21 17:10:46.187963 

# 时间差对象
day_delta_new = day_future - day_last
print(day_delta_new, type(day_delta_new))
# 2 days, 0:00:00 
(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)}小时,你就过生日了")

你可能感兴趣的:(python,开发语言)