Python datetime模块完整指南:date、time、datetime与timedelta详解

认真发呆
认真发呆
发布时间:2026-10-13| 2人浏览过
原创

本文详细介绍Python中datetime模块的核心类,包括date、time、datetime和timedelta。涵盖类属性、常用方法、参数范围及运算符重载,并提供strftime格式字符串对照表,帮助开发者高效进行日期时间的创建、计算与格式化操作。

前言

Python内置了多个用于处理日期和时间的模块,例如calendar、time和datetime。其中,time模块的接口设计与C标准库中的time.h基本保持一致。相比之下,datetime模块提供的接口更加直观,且调用方式更为简便。

该模块定义了两个关键常量:

  1. datetime.MINYEAR
  2. datetime.MAXYEAR

这两个常量分别代表了datetime模块所能表示的最小年份和最大年份。具体数值为:MINYEAR等于1,MAXYEAR等于9999。

datetime模块主要定义了以下五个类:

  1. datetime.date:用于表示日期的类,常用属性包括year(年)、month(月)和day(日);
  2. datetime.time:用于表示时间的类,常用属性包括hour(时)、minute(分)、second(秒)和microsecond(微秒);
  3. datetime.datetime:用于表示具体的日期和时间;
  4. datetime.timedelta:用于表示两个时间点之间的时间间隔长度;
  5. datetime.tzinfo:用于处理与时区相关的信息。

需要注意的是,上述列举的所有类型对象均为不可变(immutable)对象。

date类

date类用于表示一个具体的日期(由年、月、日组成),其构造函数原型如下:

class datetime.date(year, month, day)

参数说明:

  1. year参数的取值范围为[MINYEAR, MAXYEAR],即[1, 9999];
  2. month参数的取值范围为[1, 12](注意:月份从1开始计数,而非0);
  3. day参数的最大值取决于给定的year和month参数。例如,在闰年的2月份,day的最大值为29;

date类定义了一些常用的类方法与类属性:

  1. date.max、date.min:分别表示date对象所能表示的最大日期和最小日期;
  2. date.resolution:表示date对象所表示日期的最小单位,此处为天;
  3. date.today():返回一个表示当前本地日期的date对象;
  4. date.fromtimestamp(timestamp):根据给定的时间戳,返回一个date对象;
  5. datetime.fromordinal(ordinal):将Gregorian日历时间(序数)转换为date对象(Gregorian Calendar即公历,类似于我国的农历,西方国家使用较多,此处不作详细展开);

使用示例:

>>> datetime.date.max
datetime.date(9999, 12, 31)
>>> datetime.date.min
datetime.date(1, 1, 1)
>>> datetime.date.resolution
datetime.timedelta(1)
>>> datetime.date.today()
datetime.date(2016, 5, 12)
>>> datetime.date.fromtimestamp(time.time())
datetime.date(2016, 5, 12)

date类提供的实例方法和属性:

  1. date.year、date.month、date.day:分别获取年、月、日;
  2. date.replace(year, month, day):生成一个新的日期对象,使用参数指定的年、月、日替换原有对象中的对应属性(原有对象保持不变);
  3. date.timetuple():返回与日期对应的time.struct_time对象;
  4. date.toordinal():返回日期对应的Gregorian Calendar序数;
  5. date.weekday():返回星期几,星期一返回0,星期二返回1,依此类推;
  6. date.isoweekday():返回星期几,星期一返回1,星期二返回2,依此类推;
  7. date.isocalendar():返回格式为(year, month, day)的元组;
  8. date.isoformat():返回格式为'YYYY-MM-DD'的字符串;
  9. date.strftime(fmt):根据自定义格式字符串进行格式化。

使用示例:

>>> today = datetime.date.today()
>>> today.year
2016
>>> today.month
5
>>> today.day
12
>>> tomorrow = today.replace(day=13)
>>> tomorrow
datetime.date(2016, 5, 13)
>>> tomorrow.timetuple()
time.struct_time(tm_year=2016, tm_mon=5, tm_mday=13, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=134, tm_isdst=-1)
>>> tomorrow.toordinal()
736097
>>> tomorrow.weekday()
4
>>> tomorrow.isoweekday()
5
>>> tomorrow.isocalendar()
(2016, 19, 5)
>>> tomorrow.isoformat()
'2016-05-13'
>>> tomorrow.strftime("%y-%m-%d")
'16-05-13'

date类重载了简单的运算符:

date类支持日期的加减运算和比较操作:

date2 = date1 + timedelta:

日期加上一个时间间隔,返回一个新的日期对象

date2 = date1 - timedelta:

日期减去一个时间间隔,返回一个新的日期对象

timedelta = date1 - date2:

两个日期相减,返回一个时间间隔(timedelta)对象

date1 < date2:

两个日期之间进行比较。

使用示例:

>>> now = datetime.date.today()
>>> now
datetime.date(2016, 5, 12)
>>> now += datetime.date.resolution
>>> now
datetime.date(2016, 5, 13)
>>> now -= datetime.date.resolution
>>> now
datetime.date(2016, 5, 12)
>>> now < datetime.date.max
True

Time类

time类用于表示时间(由时、分、秒以及微秒组成),其构造函数原型如下:

class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

参数说明:

  1. hour的取值范围为[0, 24),
  2. minute的取值范围为[0, 60),
  3. second的取值范围为[0, 60),
  4. microsecond的取值范围为[0, 1000000),
  5. tzinfo表示时区信息。

time类定义的类属性:

  1. time.min、time.max:time类所能表示的最小和最大时间。其中,time.min = time(0, 0, 0, 0),time.max = time(23, 59, 59, 999999);
  2. time.resolution:时间的最小单位,此处为1微秒;

使用示例:

>>> datetime.time.min
datetime.time(0, 0)
>>> datetime.time.max
datetime.time(23, 59, 59, 999999)
>>> datetime.time.resolution
datetime.timedelta(0, 0, 1)

time类提供的实例方法和属性:

  1. time.hour、time.minute、time.second、time.microsecond:分别获取时、分、秒、微秒;
  2. time.tzinfo:获取时区信息;
  3. time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个新的时间对象,使用参数指定的时、分、秒、微秒替换原有对象中的属性(原有对象保持不变);
  4. time.isoformat():返回形如“HH:MM:SS”格式的字符串表示;
  5. time.strftime(fmt):返回自定义格式化字符串。

使用示例:

>>> tm = datetime.time(18, 18, 18)
>>> tm.hour
18
>>> tm.minute
18
>>> tm.second
18
>>> tm.microsecond
0
>>> tm.tzinfo
>>> tm.isoformat()
'18:18:18'
>>> tm.replace(hour=20)
datetime.time(20, 18, 18)
>>> tm.strftime("%I:%M:%S %p")
'06:18:18 PM'

time类的对象仅支持比较操作,不支持加减运算。

datetime类

datetime是date与time的结合体,包含了date与time的所有信息。其构造函数原型如下:

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

各参数的含义与date、time的构造函数中的参数一致,需注意参数值的取值范围。

datetime类定义的类属性与方法:

  1. datetime.min、datetime.max:datetime所能表示的最小值与最大值;
  2. datetime.resolution:datetime的最小单位;
  3. datetime.today():返回一个表示当前本地时间的datetime对象;
  4. datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
  5. datetime.utcnow():返回一个当前UTC时间的datetime对象;
  6. datetime.fromtimestamp(timestamp[, tz]):根据时间戳创建一个datetime对象,参数tz用于指定时区信息;
  7. datetime.utcfromtimestamp(timestamp):根据时间戳创建一个datetime对象;
  8. datetime.combine(date, time):根据date和time对象,创建一个datetime对象;
  9. datetime.strptime(date_string, format):将格式字符串转换为datetime对象,date与time类未提供此方法。

使用示例:

>>> datetime.datetime.min
datetime.datetime(1, 1, 1, 0, 0)
>>> datetime.datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
>>> datetime.datetime.resolution
datetime.timedelta(0, 0, 1)
>>> print datetime.datetime.resolution
0:00:00.000001
>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2016, 5, 12, 12, 46, 47, 246240)
>>> datetime.datetime.now()
datetime.datetime(2016, 5, 12, 12, 47, 9, 850643)
>>> datetime.datetime.utcnow()
datetime.datetime(2016, 5, 12, 4, 47, 42, 188124)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2016, 5, 12, 12, 48, 40, 459676)
>>> datetime.datetime.combine(datetime.date(1990, 10, 05), datetime.time(18, 18, 18))
datetime.datetime(1990, 10, 5, 18, 18, 18)
>>> datetime.datetime.strptime("2010-04-07 01:48:16.234000", "%Y-%m-%d %H:%M:%S .%f")
datetime.datetime(2010, 4, 7, 1, 48, 16, 234000)

datetime的实例方法与属性

datetime类提供的实例方法与属性大部分功能与date和time类似,此处仅罗列方法名,不再赘述:

  1. datetime.year、month、day、hour、minute、second、microsecond、tzinfo:
  2. datetime.date():获取date对象;
  3. datetime.time():获取time对象;
  4. datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]):
  5. **datetime.timetuple() **
  6. **datetime.utctimetuple() **
  7. datetime.toordinal()
  8. datetime.weekday()
  9. datetime.isocalendar()
  10. datetime.isoformat([sep])
  11. datetime.ctime():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
  12. datetime.strftime(format)

datetime对象同样可以进行比较,或者相减返回一个时间间隔(timedelta)对象,或者日期时间加上一个间隔返回一个新的日期时间对象。

timedelta类

datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减时可以返回一个timedelta对象。其构造函数原型如下:

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

所有参数均为可选,且默认值均为0,参数的值可以是整数、浮点数、正数或负数。

内部仅存储days、seconds、microseconds,其他参数的值会自动按如下规则进行转换:

  1. 1 millisecond(毫秒)转换为1000 microseconds(微秒)
  2. 1 minute转换为60 seconds
  3. 1 hour转换为3600 seconds
  4. 1 week转换为7 days

三个核心参数的取值范围分别为:

  1. 0 <= microseconds < 1000000
  2. 0 <= seconds < 3600*24(一天的秒数)
  3. -999999999 <= days <= 999999999

timedelta类定义的类属性:

  1. timedelta.min:时间间隔对象的最小值,即timedelta(-999999999)。
  2. timedelta.max:时间间隔对象的最大值,即timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)。
  3. timedelta.resolution:时间间隔的最小单位,即timedelta(microseconds=1)。

使用示例:

>>> datetime.timedelta.min
datetime.timedelta(-999999999)
>>> datetime.timedelta.max
datetime.timedelta(999999999, 86399, 999999)
>>> datetime.timedelta.resolution
datetime.timedelta(0, 0, 1)
>>> print datetime.timedelta.resolution
0:00:00.000001

timedelta实例方法

  1. timedelta.total_seconds():计算时间间隔的总秒数

使用示例:

>>> datetime.timedelta.resolution.total_seconds()
1e-06

格式字符串

datetime、date、time均提供了strftime()方法,该方法接收一个格式字符串,输出日期时间的字符串表示。支持的转换格式如下:

%a星期的简写。如 星期三为Web
%A星期的全写。如 星期三为Wednesday
%b月份的简写。如4月份为Apr
%B月份的全写。如4月份为April
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
%d: 日在这个月中的天数(是这个月的第几天)
%f: 微秒(范围[0,999999])
%H: 小时(24小时制,[0, 23])
%I: 小时(12小时制,[0, 11])
%j: 日在年中的天数 [001,366](是当年的第几天)
%m: 月份([01,12])
%M: 分钟([00,59])
%p: AM或者PM
%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
%U: 周在当年的周数当年的第几周),星期天作为周的第一天
%w: 今天在这周的天数,范围为[0, 6],6表示星期天
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x: 日期字符串(如:04/07/10)
%X: 时间字符串(如:10:43:39)
%y: 2个数字表示的年份
%Y: 4个数字表示的年份
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z: 时区名称(如果是本地时间,返回空字符串)
%%: %% => %

使用示例:

>>> dt = datetime.datetime.now()
>>> dt.strftime('%Y-%m-%d %H:%M:%S %f')
'2016-05-12 14:19:22 333943'
>>> dt.strftime('%y-%m-%d %I:%M:%S %p')
'16-05-12 02:19:22 PM'
>>> dt.strftime("%a")
'Thu'
>>> dt.strftime("%A")
'Thursday'
>>> dt.strftime("%b")
'May'
>>> dt.strftime("%B")
'May'
>>> dt.strftime("%c")
'Thu May 12 14:19:22 2016'
>>> dt.strftime("%x")
'05/12/16'
>>> dt.strftime("%X")
'14:19:22'
>>> dt.strftime("%w")
'4'
>>> dt.strftime("%j")
'133'
>>> dt.strftime("%u")
'4'
>>> dt.strftime("%U")
'19'

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或工作能带来一定的帮助。如果有疑问,欢迎留言交流。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。