【标准库】日期和时间

一、日期的解析与格式化

此处介绍如何将一个字符串转为日期类型,用于数学运算;以及如何将一个日期类型按照期望的格式输出为字符串;日期的解析与格式化我们使用标准库 datetime 实现。

日期的解析和格式化使用如下两个方法:

  • strptime: String -> Time (解析字符串为时间对象)
  • strftime: String <- Time (格式化时间对象为字符串)

日期的格式化输出与解析需要按照一定的规则解析,主要使用到的格式指令如下:

指令 含意
%Y
%m 十进制数 [01,12] 表示的月。
%d 十进制数 [01,31] 表示的日(每月中的日)。
%H 十进制数 [00,23] 表示的小时(24小时制)。
%M 十进制数 [00,59] 表示的分钟。
%S 十进制数 [00,61] 表示的秒。
%I 十进制数 [01,12] 表示的小时(12小时制)。
%p 本地化的 AM 或 PM 。
%z 时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。
%a 本地化的缩写星期中每日的名称。
%A 本地化的星期中每日的完整名称。
%b 本地化的月缩写名称。
%B 本地化的月完整名称。

1、获取当前时间

1
from datetime import datetime
方法 描述
datetime.today() 返回当前的本地日期
datetime.now(tz=None) 返回表示当前地方时的 date 和 time 对象,tz代表时区信息,在tz未指定的情况下,类似于 today()

借助timedelta获得时间偏差,在使用timezone包装为时区对象,使用now()构建时指定时区

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> from datetime import datetime
>>> datetime.today()
datetime.datetime(2026, 1, 26, 13, 21, 19, 176580)
>>> datetime.now()
datetime.datetime(2026, 1, 26, 13, 21, 23, 429758)

# 导入时区信息,获取标准utc时间
>>> from datetime import timezone
>>> datetime.now(tz=timezone.utc) # 指定时区为标准的 utc
datetime.datetime(2026, 1, 26, 5, 21, 50, 143631, tzinfo=datetime.timezone.utc)

# 指定其他时区信息
>>> from datetime import timezone, timedelta
>>> beijing_tz = timezone(timedelta(hours=8))
>>> bj_now = datetime.now(tz=beijing_tz)
>>> bj_now
datetime.datetime(2026, 1, 26, 19, 7, 9, 679998, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

2、构建 datetime 对象

方法 描述
datetime(year, month, day, hour, miniute, second) 指定固定值构建 datetime对象,也支持直接构建 datetime
datetime.fromtimestamp(timestamp, tz=None) 返回 POSIX 时间戳对应的本地日期和时间,如 time.time()返回值
datetime.strptime(date_string, format) 按照指定格式解析日期字符串

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> from datetime import datetime
>>> datetime(2021, 12, 14, 22, 18, 48)
datetime.datetime(2021, 12, 14, 22, 18, 48)

# 构建 date 或 time
>>> from datetime import date, time
>>> date(2027, 2, 22)
datetime.date(2027, 2, 22)
>>> time(23, 12, 1)
datetime.time(23, 12, 1)

# 来自于时间辍
>>> import time
>>> datetime.fromtimestamp(time.time())
datetime.datetime(2026, 1, 26, 13, 30, 58, 796462)

# 解析字符串
>>> datetime.strptime('2025-12-01 12:23:34', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2025, 12, 1, 12, 23, 34)

# 带有utc时区信息
>>> now = datetime.strptime('2026-01-26 19:10:12 +08:00', '%Y-%m-%d %H:%M:%S %z')
>>> now
datetime.datetime(2026, 1, 26, 19, 10, 12, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

3、格式化输出

日期对象的格式化输出借助 strftime 方法实现。

方法 描述
datetime.strftime(format) 按照指定格式解析日期对象

示例:

1
2
3
4
5
6
7
8
9
>>> now = datetime.today()
>>> now
datetime.datetime(2026, 1, 26, 18, 38, 0, 241473)
>>> now.strftime('%Y-%m/%d')
'2026-01/26'
>>> now.strftime('%H:%M:%S')
'18:38:00'
>>> now.strftime('%Y-%m-%d %H:%M:%S')
'2026-01-26 18:38:00'

二、时间的数学运算

在项目开发中,我们可能会需要比较两个日期的大小,即哪个早于或者晚于哪个日期;或者对日期进行运算,增加多少秒,多少小时,多少天等操作。

1、比较运算

datetime支持向相同类型的日期直接进行数学运算比较。

注意事项:

  • 需要在相同类型之间比较,不同类型之间如果需要比较,首先需要进行类型转换,例如: datedatetime比较,需要先将datetime转为date
  • 不要混合比较带有时区信息和无时区信息的日期实例
运算符 描述
< 小于
<= 小于等于
== 等于
> 大于
>= 大于等于

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> from datetime import datetime
>>> d1 = datetime(2026, 1, 26, 18, 46, 0)
>>> d2 = datetime(2026, 1, 26, 18, 46, 23)
>>> d3 = datetime(2026, 1, 26, 18, 46, 0)
>>> d1 < d2
True
>>> d1 <= d2
True
>>> d1 == d3
True
>>> d2 > d3
True
>>> d1 > d3
False
>>> d1 >= d3
True
>>> d1 < d3
False
>>> d1 <= d3
True

2、时间偏移运算

日期时间的偏移计算需要使用到 timedelta ,timedelta表示一段持续的时间。

语法:

1
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

如果需要将时间前移,设置值为负数或者直接使用 减号 -

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> from datetime import datetime, timedelta
>>> add_days = timedelta(days=2)
>>> now = datetime.today()
>>> now
datetime.datetime(2026, 1, 26, 18, 53, 54, 744691)

# 天数增加
>>> now + add_days
datetime.datetime(2026, 1, 28, 18, 53, 54, 744691)

# 小时减小
>>> minus_hour = timedelta(hours=-3)
>>> now + minus_hour
datetime.datetime(2026, 1, 26, 15, 53, 54, 744691)

# 使用 减号 - 减小天数
>>> now - add_days
datetime.datetime(2026, 1, 24, 18, 53, 54, 744691)