前言

时间信息是编程中怎么也绕不开的信息之一,Python中内置了时间处理的标准库timedatetimecalendar,可以帮助我们快速地处理时间。

time模块

时间格式

主要分为时间戳(timestamp)、结构化时间(struct_time)和字符串时间(str format time)

1
2
3
4
5
6
7
8
import time

# 时间戳
print(time.time()) # 1737185593.3408048
# 结构化时间
print(time.localtime()) # time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=15, tm_min=33, tm_sec=13, tm_wday=5, tm_yday=18, tm_isdst=0)
# 字符串时间
print("2025年1月18日 15点33分")

时间戳的取值是指输入时间距Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

struct_time可以让我们很容易获得当前时间的格式化信息,包括年月日、时分秒、星期几(从0开始为星期一)以及是今年的第几天的具体数字

1
2
3
4
5
6
7
8
9
10
11
struct_time = time.localtime()

print(struct_time.tm_year)
print(struct_time.tm_mon)
print(struct_time.tm_mday)
print(struct_time.tm_hour)
print(struct_time.tm_min)
print(struct_time.tm_sec)
print(struct_time.tm_wday)
print(struct_time.tm_yday)
print(struct_time.tm_isdst)

字符串格式是更加符合我们日常生活的格式,如2025年1月18日 15点33分

处理时间的关键就在于把握好上述三种格式的相互转化关系

相互转化

  1. timestampstruct_time的相互转化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 时间戳转化为struct_time
    now = time.time()

    print(time.localtime(now))
    # time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=15, tm_min=55, tm_sec=56, tm_wday=5, tm_yday=18, tm_isdst=0)
    # struct_time转化为时间戳
    now2 = time.struct_time((2025, 1, 18, 15, 55, 6, 5, 18, 0))

    print(time.mktime(now2)) # 1737186906.0
  2. 字符串和struct_time的相互转化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # str format time 转化为struct_time
    now = "2025年1月18日 15点33分"

    print(time.strptime(now, "%Y年%m月%d日 %H点%M分")) # time.struct_time(tm_year=2025, tm_1on=1, tm_mday=18, tm_hour=15, tm_min=33, tm_sec=0, tm_wday=5, tm_yday=18, tm_isdst=-1)

    # struct_time转化为str format time
    struct_time = time.strptime(now, "%Y年%m月%d日 %H点%M分")
    print(time.asctime(struct_time)) # Sat Jan 18 15:33:00 2025
    print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time)) # 2025-01-18 15:33:00

    使用strftimestrptime需要使用到日期的匹配模板,一般来说只需要记住以下常用的即可

    符号 含义
    %Y
    %m
    %d
    %H
    %M
    %S

    不同的字符串时间,匹配模板的连接词也需要对应

    1
    2
    3
    4
    5
    6
    7
    8
    strtime = "2025-01-18 15:33:00"
    strtime2 = "2025/01/18 15 33 00"
    strtime3 = "2025年01月18日 15时33分00秒"

    print(time.strptime(strtime, "%Y-%m-%d %H:%M:%S"))
    print(time.strptime(strtime2, "%Y/%m/%d %H %M %S"))
    print(time.strptime(strtime3, "%Y年%m月%d日 %H时%M分%S秒"))
    # time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=15, tm_min=33, tm_sec=0, tm_wday=5, tm_yday=18, tm_isdst=-1)
  3. timestamp与str format time的相互转化

    需要struct_time作为桥梁

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 时间戳转化为str format time
    now = time.time()

    print(time.ctime(now)) # Sat Jan 18 15:55:56 2025
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(now))) # 2025-01-18 15:55:56

    # str format time 转化为时间戳
    now = "2025年1月18日 15点33分"

    print(time.mktime(time.strptime(now, "%Y年%m月%d日 %H点%M分"))) # 1737179980.0

常见应用

  1. 计算程序运行时间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import time

    # 计算程序运行时间
    # 开始时间戳
    start_time:float = time.time()

    # 程序运行 1 秒
    time.sleep(1)

    # 结束时间戳
    end_time:float = time.time()

    # 计算程序运行时间
    print(end_time - start_time) # 1.0004777908325195
  2. 程序休眠

    1
    2
    3
    4
    5
    6
    flag = True
    if(flag):
    time.sleep(5)
    print("5秒后执行")
    else:
    print("不执行")

datetime模块

datetime是对time的封装库,可以很方便对时间进行运算

创建和使用datetime

1
2
3
4
5
6
import datetime

# 创建datetime对象
print(datetime.date(2025, 1, 18)) # 2025-01-18
print(datetime.datetime(2025, 1, 18, 15, 33, 0)) # 2025-01-18 15:33:00
print(datetime.datetime.now()) # 2025-01-18 15:55:56.852007

也可以从str format time和timeStamp转化而来

1
2
3
4
5
time1 = time.time( )
print(datetime.datetime.fromtimestamp(time1)) # 2025-01-18 15:55:56.852007

time2 = "2025-01-18 15:55:56"
print(datetime.datetime.strptime(time2, "%Y-%m-%d %H:%M:%S")) # 2025-01-18 15:55:56

datetime对象也获取具体时间信息

1
2
3
4
5
6
7
8
9
10
11
12
13
# datetime对象使用
dt = datetime.datetime.now()
print(dt.year) # 2025
print(dt.month) # 1
print(dt.day) # 18
print(dt.hour) # 15
print(dt.minute) # 55
print(dt.second) # 56

print(dt.date()) # 2025-01-18
print(dt.time()) # 15:55:56.852007
# 获取星期几
print(dt.weekday()) # 5

转化关系

datetime对象可转化struct_time、str format time和timeStamp

1
2
3
4
5
6
7
now = datetime.datetime.now()

print(now.timestamp()) # 1737189854.462337
print(now.ctime()) # Sat Jan 18 16:44:14 2025
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 2025-01-18 16:44:14
print(now.strftime("%Y年%m月%d日 %H时%M分%S秒")) # 2025年01月18日 16时44分14秒
print(now.timetuple()) # time.struct_time(tm_year=2025, tm_mon=1, tm_mday=18, tm_hour=16, tm_min=44, tm_sec=14, tm_wday=5, tm_yday=18, tm_isdst=-1)

更详细的转化关系如下所示

时间运算

查看datetime源码,可以看到对__equal____add____ads__在内的魔术方法都进行了实现,这就是为什么datetime对象能够很方便进行时间的运算(基于timedelta

  1. 大小比较

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    day = datetime.datetime(2025, 1, 18)

    day2 = datetime.datetime(2025, 1, 18)
    day3 = datetime.datetime(2025, 1, 18, 15, 33, 0)

    print(day2 == day) # True
    print(day3 == day) # False

    print(day2 >= day) # True
    print(day3 < day) # True
  2. 加减乘除

    1
    2
    3
    day = datetime.datetime(2025, 1, 18)
    gaokao = datetime.datetime(2025, 6, 7)
    print(gaokao - day) # 140 days, 0:00:00
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    day = datetime.datetime(2025, 1, 18)
    # 加减一天
    print(day + datetime.timedelta(days=1)) # 2025-01-19 00:00:00
    print(day + datetime.timedelta(days=-1)) # 2025-01-17 00:00:00

    # 加减一小时
    print(day + datetime.timedelta(hours=1)) # 2025-01-18 01:00:00
    print(day + datetime.timedelta(hours=-1)) # 2025-01-17 23:00:00

    # 加减一分钟
    print(day + datetime.timedelta(minutes=1)) # 2025-01-18 00:01:00
    print(day + datetime.timedelta(minutes=-1)) # 2025-01-17 23:59:00

    # 加减一秒
    print(day + datetime.timedelta(seconds=1)) # 2025-01-18 00:00:01
    print(day + datetime.timedelta(seconds=-1)) # 2025-01-17 23:59:59
    1
    2
    3
    4
    5
    6
    7
    8
    # 乘除法
    day = datetime.datetime(2025, 1, 18)

    # 加半天
    print(day + datetime.timedelta(days=1) / 2) # 2025-01-19 12:00:00

    # 加两天
    print(day + datetime.timedelta(days=1) * 2) # 2025-01-20 00:00:00
  3. 绝对值

    如果出现时间时间差为负数的情况,可以使用abs进行修正

    1
    2
    3
    4
    5
    6
    day = datetime.datetime(2025, 1, 18, 15, 33, 0)

    gaokao = datetime.datetime(2025, 6, 7)

    print(day - gaokao) # -140 days, 15:33:00
    print(abs(day - gaokao)) # 139 days, 8:27:00
  4. 转化为秒、天

    1
    2
    3
    4
    5
    6
    # 转化为秒
    datetime.timedelta(seconds= 1).total_seconds() # 1.0
    datetime.timedelta(minutes= 1).total_seconds() # 60.0
    datetime.timedelta(hours= 1).total_seconds() # 3600.0
    datetime.timedelta(days= 1).total_seconds() # 86400.0
    datetime.timedelta(weeks= 1).total_seconds() # 604800.0
    1
    2
    3
    4
    5
    6
    # 转化为秒 有局限性
    print(datetime.timedelta(seconds= 1).seconds) # 1
    print(datetime.timedelta(minutes= 1).seconds) # 60
    print(datetime.timedelta(hours= 1).seconds) # 3600
    print(datetime.timedelta(days= 1).seconds) # 0
    print(datetime.timedelta(weeks= 1).seconds) # 0
    1
    2
    3
    4
    5
    6
    # 转化为天
    print(datetime.timedelta(seconds= 1).days) # 0
    print(datetime.timedelta(minutes= 1).days) # 0
    print(datetime.timedelta(hours= 1).days) # 0
    print(datetime.timedelta(days= 1).days) # 1
    print(datetime.timedelta(weeks= 1).days) # 7

calendar模块

是一个专门用来处理日期的模块

  1. 打印一年的日历

    1
    2
    3
    4
    # 输出日历
    import calendar

    print(calendar.calendar(2025)) # 输出2025年的日历
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
                                      2025

    January February March
    Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
    1 2 3 4 5 1 2 1 2
    6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
    13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
    20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
    27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
    31

    April May June
    Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
    1 2 3 4 5 6 1 2 3 4 1
    7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
    14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
    21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
    28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
    30

    July August September
    Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
    1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7
    7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14
    14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21
    ...
    13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
    20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
    27 28 29 30 31 24 25 26 27 28 29 30 29 30 31
  2. 打印一月的日历

    1
    print(calendar.month(2025, 1)) # 输出2025年1月的日历
    1
    2
    3
    4
    5
    6
    7
     January 2025
    Mo Tu We Th Fr Sa Su
    1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31
  3. 日期矩阵

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import calendar

    month = calendar.monthcalendar(2025, 1)
    print(month)
    # [[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 31, 0, 0]]

    print("Mo Tu We Th Fr Sa Su")
    for week in month:
    for day in week:
    if day == 0:
    print(" ", end=" ")
    else:
    print(f"{day:2}", end=" ")
    print()
    """
    Mo Tu We Th Fr Sa Su
    1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31
    """
  4. 该日期是星期几

    1
    2
    # 返回星期几
    print(calendar.weekday(2025, 1, 18)) # 5 星期六
  5. 该年是否是闰年

    1
    2
    3
    print(calendar.isleap(2025)) # False
    # [2000,2024)闰年的数量
    print(calendar.leapdays(2000, 2025)) # 7
  6. 该月有几天,第一天是星期几

    1
    2
    # 返回一个元组,第一个元素是星期几,第二个元素是这个月有多少天
    print(calendar.monthrange(2025, 2)) # (5, 28)

参考文献

  1. Python的time和datetime模块详解 - 271374667 - 博客园
  2. time — 时间的访问和转换 — Python 3.13.1 文档
  3. calendar — 通用日历相关函数 — Python 3.13.1 文档
  4. datetime — 基本日期和时间类型 — Python 3.13.1 文档