Python datetime模块完整指南:date、time、datetime与timedelta详解
本文详细介绍Python中datetime模块的核心类,包括date、time、datetime和timedelta。涵盖类属性、常用方法、参数范围及运算符重载,并提供strftime格式字符串对照表,帮助开发者高效进行日期时间的创建、计算与格式化操作。
前言
Python内置了多个用于处理日期和时间的模块,例如calendar、time和datetime。其中,time模块的接口设计与C标准库中的time.h基本保持一致。相比之下,datetime模块提供的接口更加直观,且调用方式更为简便。
该模块定义了两个关键常量:
- datetime.MINYEAR
- datetime.MAXYEAR
这两个常量分别代表了datetime模块所能表示的最小年份和最大年份。具体数值为:MINYEAR等于1,MAXYEAR等于9999。
datetime模块主要定义了以下五个类:
- datetime.date:用于表示日期的类,常用属性包括year(年)、month(月)和day(日);
- datetime.time:用于表示时间的类,常用属性包括hour(时)、minute(分)、second(秒)和microsecond(微秒);
- datetime.datetime:用于表示具体的日期和时间;
- datetime.timedelta:用于表示两个时间点之间的时间间隔长度;
- datetime.tzinfo:用于处理与时区相关的信息。
需要注意的是,上述列举的所有类型对象均为不可变(immutable)对象。
date类
date类用于表示一个具体的日期(由年、月、日组成),其构造函数原型如下:
class datetime.date(year, month, day)
参数说明:
- year参数的取值范围为[MINYEAR, MAXYEAR],即[1, 9999];
- month参数的取值范围为[1, 12](注意:月份从1开始计数,而非0);
- day参数的最大值取决于给定的year和month参数。例如,在闰年的2月份,day的最大值为29;
date类定义了一些常用的类方法与类属性:
- date.max、date.min:分别表示date对象所能表示的最大日期和最小日期;
- date.resolution:表示date对象所表示日期的最小单位,此处为天;
- date.today():返回一个表示当前本地日期的date对象;
- date.fromtimestamp(timestamp):根据给定的时间戳,返回一个date对象;
- 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类提供的实例方法和属性:
- date.year、date.month、date.day:分别获取年、月、日;
- date.replace(year, month, day):生成一个新的日期对象,使用参数指定的年、月、日替换原有对象中的对应属性(原有对象保持不变);
- date.timetuple():返回与日期对应的time.struct_time对象;
- date.toordinal():返回日期对应的Gregorian Calendar序数;
- date.weekday():返回星期几,星期一返回0,星期二返回1,依此类推;
- date.isoweekday():返回星期几,星期一返回1,星期二返回2,依此类推;
- date.isocalendar():返回格式为(year, month, day)的元组;
- date.isoformat():返回格式为'YYYY-MM-DD'的字符串;
- 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)
参数说明:
- hour的取值范围为[0, 24),
- minute的取值范围为[0, 60),
- second的取值范围为[0, 60),
- microsecond的取值范围为[0, 1000000),
- tzinfo表示时区信息。
time类定义的类属性:
- time.min、time.max:time类所能表示的最小和最大时间。其中,time.min = time(0, 0, 0, 0),time.max = time(23, 59, 59, 999999);
- 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类提供的实例方法和属性:
- time.hour、time.minute、time.second、time.microsecond:分别获取时、分、秒、微秒;
- time.tzinfo:获取时区信息;
- time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个新的时间对象,使用参数指定的时、分、秒、微秒替换原有对象中的属性(原有对象保持不变);
- time.isoformat():返回形如“HH:MM:SS”格式的字符串表示;
- 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类定义的类属性与方法:
- datetime.min、datetime.max:datetime所能表示的最小值与最大值;
- datetime.resolution:datetime的最小单位;
- datetime.today():返回一个表示当前本地时间的datetime对象;
- datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
- datetime.utcnow():返回一个当前UTC时间的datetime对象;
- datetime.fromtimestamp(timestamp[, tz]):根据时间戳创建一个datetime对象,参数tz用于指定时区信息;
- datetime.utcfromtimestamp(timestamp):根据时间戳创建一个datetime对象;
- datetime.combine(date, time):根据date和time对象,创建一个datetime对象;
- 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类似,此处仅罗列方法名,不再赘述:
- datetime.year、month、day、hour、minute、second、microsecond、tzinfo:
- datetime.date():获取date对象;
- datetime.time():获取time对象;
- datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]):
- **datetime.timetuple() **
- **datetime.utctimetuple() **
- datetime.toordinal()
- datetime.weekday()
- datetime.isocalendar()
- datetime.isoformat([sep])
- datetime.ctime():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
- 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 millisecond(毫秒)转换为1000 microseconds(微秒)
- 1 minute转换为60 seconds
- 1 hour转换为3600 seconds
- 1 week转换为7 days
三个核心参数的取值范围分别为:
- 0 <= microseconds < 1000000
- 0 <= seconds < 3600*24(一天的秒数)
- -999999999 <= days <= 999999999
timedelta类定义的类属性:
- timedelta.min:时间间隔对象的最小值,即timedelta(-999999999)。
- timedelta.max:时间间隔对象的最大值,即timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)。
- 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实例方法
- 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'
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或工作能带来一定的帮助。如果有疑问,欢迎留言交流。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









