本篇索引
(1)datetime模块
(2)time模块
(1)datetime模块
datetime模块可以处理时间和日期,其中包含以下类:date类、time对象、datetime对象、timedelt对象、tzinfo对象。
● date类
date类用于处理日期。
操作 | 说明 |
---|---|
创建date对象 | |
date(year, month, day) | 创建一个新的日期对象,返回的date对象是不可变的。入参year, month, day分别整数形式的年、月、日。 |
类属性 | |
date.min | 能够表示的最小日期:datetime.date(1,1,1)。 |
date.max | 能够表示的最大日期:datetime.date(9999,12,31)。 |
date.resolutiom | 不相等的日期之间最小可解析的差值:datetime.timedelta(1) |
类方法 | |
date.today() | 返回当前日期的date对象。 |
date.fromtimestamp(timestamp) | 返回对应时间戳timestamp的date对象,timestamp是time.time()函数的返回值。 |
date.fromordinal(ordinal) | 返回从最小日期(公元1年1月1日)开始算起的ordinal天的date对象。 |
实例属性 | |
d.year | 实例日期对应的年。 |
d.month | 实例日期对应的月。 |
d.day | 实例日期对应的日。 |
实例方法 | |
d.weekday() | 返回实例日期对应的周几,范围:0~6(0表示周一) |
d.isoweekday() | 返回实例日期对应的周几,范围:1~7(1表示周一) |
d.ctime() | 返回一个字符串,格式与“time模块”中的time.ctime()的格式相同。 |
d.isoformat() | 返回一个字符串(ISO 8601格式),形式为:'YYYY-MM-DD' |
d.isocalendar() | 返回一个元组:(iso_year, iso_week, iso_weekday),iso_weekday范围为:1~7,iso_week范围为:1~53(当年第一个星期四的周为第1周)。 |
d.strftime(format) | 返回一个字符串,表示日期的格式与“time模块”中的time.strftime()相同,只能用于1900年以后的日期。 format格式说明 |
d.timetuple() | 返回适合函数在time模块中使用的time_struct对象,其中小时、分、秒设为0。 |
d.toordinal() | 将实例日期转换为一个从公元1年1月日起的天数值。 |
d.replace([year [,month [,day]]]) | 返回一个新的date对象,并使用入参值代替原有值。 |
● time类
time类用于处理时间。
操作 | 说明 |
---|---|
创建time对象 | |
time(hour [,minute [,second [,microsecond [,tzinfo]]]]) | 创建一个新的时间对象,返回的time对象是不可变的。入参micorsecond是微秒,入参tzinfo是一个时区tzinfo类的实例,详见后述。 |
类属性 | |
t.min | 能够表示的最小时间:datetime.time(0,0) |
t.max | 能够表示的最大时间:datetime.time(23,59,59,999999) |
t.resolution | 不等的time对象之间的最小可解析的差值:datetime.time(0,0,1) |
实例属性 | |
d.hour | 实例日期对应的小时。 |
d.minute | 实例日期对应的分。 |
d.second | 实例日期对应的秒。 |
d.microsecond | 实例日期对应的微秒。 |
d.tzinfo | 实例日期对应的tzinfo时区。 |
实例方法 | |
t.isoformat() | 返回一个字符串,形式为:"HH:MM:SS.mmmmmm",如果微秒为0,则省略微秒部分。如果提供了时区信息,会再加上一个偏移量。 |
t.strftime(format) | 返回一个字符串,格式与“time模块”中的time.strftime()相同。 format格式说明 |
t.replace(hour [,minute [,second [,microsecond [,tzinfo]]]]) | 返回一个新的time对象,并使用入参提供的值替代原实例中的值。 |
t.dst() | 返回t.tzinfo.dst(None)的值(夏令时),是一个timedelta对象。如果未设置时区,则返回None。 |
t.tzname() | 返回t.tzinfo.tzname()的值,如果未设置时区,则返回None。 |
t.utcoffset() | 返回t.tzinfo.utcoffset(None)的值,是一个timedelta对象。如果未设置时区,则返回None。 |
● datetime类
datetime类用于处理时间和日期。
操作 | 说明 |
---|---|
创建datetime对象 | |
datetime(year, month, day [hour [,minute [,second [,microsecond [,tzinfo]]]]]) | 创建一个新的datetime对象,入参含义同date对象和time对象。返回的datetime对象是不可变的。 |
类属性 | |
datetime.min | 能够表示的最小时间:datetime.datetime(1,1,1,0,0) |
datetime.max | 能够表示的最大时间:datetime.datetime(9999,12,31,23,59,59,999999) |
datetime.resolution | 不等的datetime对象之间的最小可解析的差值:datetime.timedelta(0,0,1) |
类方法 | |
datetime.now([tz]) | 基于当前本地日期时间创建一个datetime对象,tz是可选时区信息。 |
datetime.utcnow() | 基于当前的UTC日期时间创建一个datetime对象。 |
datetime.combine(date, time) | 通过组合date对象和time对象,创建出一个datetime对象。 |
datetime.fromordinal() | 通过指定序数天数,创建一个datetime对象,时间数值均为0。 |
datetime.fromtimestamp(timestamp [,tz]) | 基于“time模块”中的time.time()函数返回的时间戳,创建一个datetime对象,tz是可选时区信息。 |
datetime.utcfromtimestamp(timestamp) | 基于“time模块”中的time.gmtime()函数返回的时间戳,创建一个datetime对象。 |
datetime.strptime(datestring, format) | 根据format中的日期格式,解析datestring中的日期字符串,从而创建一个datetime对象。解析使用“time模块”中的strptime()函数。 format格式说明 |
实例属性 | |
d.year | 实例对应的年。 |
d.month | 实例对应的月。 |
d.day | 实例对应的日。 |
d.hour | 实例对应的小时。 |
d.minute | 实例对应的分。 |
d.second | 实例对应的秒。 |
d.microsecond | 实例对应的微秒。 |
d.tzinfo | 实例对应的tzinfo时区。 |
实例方法 | |
d.date() | 返回一个具有相同日期的date对象。 |
d.time() | 返回一个具有相同时间的time对象,没有时区信息。 |
d.utctimetuple() | 返回time.struct_time对象。 |
d.timetz() | 使用相同的时间和时区信息返回time对象。 |
t.strftime(format) | 返回一个字符串,格式与“time模块”中的time.strftime()相同。 format格式说明 |
d.astimezone(tz) | 返回一个位于不同时区tz中的新datetime对象,新对象的UTC标准时间同本实例的UTC标准时间。 |
d.replace(year, month, day [hour [,minute [,second [,microsecond [,tzinfo]]]]]) | 返回一个新的datetime对象,并使用入参值代替原有值。 |
● timedelta类与日期运算
timedelta对象表示两个日期或时间之间的差值(时间跨度)。
操作 | 说明 |
---|---|
创建timedelta | |
timedelta([days [,seconds [,microsecond [,miliseconds [,minutes [,hours [,weeks]]]]]]]) | 创建表示两个日期时间之差的timedelta对象,只有days, seconds, microsecond有意义,它们用于在内部表示差值。如果提供其他参数,它们将被转换为以上三值。返回的time对象是不可变的。 |
类属性 | |
timedelta.min | 能够表示的最大跨度的负timedelta值:datetime.timedelta(-999999999) |
timedelta.max | 能够表示的最大跨度的正timedelta值:datetime.timedelta(days=999999999,hours=23,minutes59,seconds=59,microseconds=999999) |
timedelta.resolution | 不等的timedelta对象之间的最小可解析的差值:datetime.timedelta(microseconds=1) |
实例属性 | |
td.days | 实例对应的天数差。 |
td.seconds | 实例对应的秒数差(一天之内)。 |
td.microseconds | 实例对应的微秒差(一天之内)。 |
timedelta本身可进行的数学运算:
操作 | 描述 | 示例 |
---|---|---|
+ | 两个时间跨度相加 | td3 = td1 + td2 |
- | 两个时间跨度相减 | td3 = td1 - td2 |
* | 时间跨度乘以整数 | td2 = td1 * i; td2 = i * td1 |
// | 时间跨度地板除以整数 | td2 = td1 // i |
+= | 一元加法 | td2 += td1 |
-= | 一元减法 | td2 -= td1 |
- | 取负 | td2 = -td1 |
abs() | 取绝对值 | td2 = abs(td1) |
< | 小于 | td1 < td2 |
<= | 小于等于 | td1 <= td2 |
== | 相等 | td1 == td2 |
!= | 不等 | td1 != td2 |
> | 大于 | td1 > td2 |
>= | 大于等于 | td1 >= td2 |
date对象、datetime对象、时间跨度timedelta对象之间可以互相运算:
操作 | 描述 | 示例 |
---|---|---|
跨度 = 日期 - 日期 | 返回timedelta对象 | td = date1 - date2 |
日期 = 日期 - 跨度 | 返回datetime对象 | date2 = date1 - td |
日期 = 日期 + 跨度 | 返回datetime对象 | date2 = date1 + td |
< | 日期比较:小于 | date1 < date2 |
<= | 日期比较:小于 | date1 <= date2 |
== | 日期比较:相等 | date1 == date2 |
!= | 日期比较:不等 | date1 != date2 |
> | 日期比较:大于 | date1 > date2 |
>= | 日期比较:大于等于 | date1 >= date2 |
日期增加1天的计算:
import datetime
the_day = datetime.datetime(2019,1,1)
one_day = datetime.timedelta(days=1)
the_next_day = the_day + one_day
the_next_day.date().isoformat() # 结果为:'2019-01-02'
● tzinfo对象。
tzinfo仅仅是一个基类,通过继承tzinfo类和实现以下方法可创建一个时区。
操作 | 说明 |
---|---|
tz.tzname(dt) | 返回代表时区名称的字符串,如:'Asia/Shanghai',入参dt是一个datetime对象或None。 |
tz.utcoffset(dt) | 返回timedelta对象,表示本地时间与UTC时间的偏移,单位是分钟。入参dt是一个datetime对象或None。 |
tz.fromutc(dt) | 将入参dt(datetime对象)从UTC时间转换为本地时区,并返回一个新的datetime对象,此方法由datetime对象上的astimezne()方法调用,tzinfo已提供了默认实现,一般没有必要重新定义此方法。 |
tz.dst(dt) | 返回一个timedelta对象,代表夏令时(Daylight Saving Time)调整。如果没有关于夏令时的信息,则返回None。入参dt是一个datetime对象或None。 |
示例如何定义一个新的时区:
import datetime
class MyZone(datetime.tzinfo):
TZOFFSET = 8 # 与UTC相差8小时
def utcoffset(self, dt):
return datetime.timedelta(hours=TZOFFSET) def tzname(self, dt):
return 'Asia/Shanghai'
(2)time模块
time模块提供与时间相关的各种函数。在Python中,测量时间的方法是计算从“纪元开始”的秒数,在time=0秒的时刻称为:epoch。在类UNIX上,“纪元开始”为1970年1月1日,其他系统上由time.gmtime(0)决定。
● struct_time对象
time模块经常会用到struct_time对象,它具有以下属性:
属性 | 值 | 属性 | 值 |
---|---|---|---|
tm_year | 年份4位数 | tm_wday | 星期几(0~6),0表示星期一 |
tm_mon | 月(1~12) | tm_yday | 一年中第几天(1~366) |
tm_mday | 日(1~31) | tm_isdst | 夏令时(-1、0、1) |
tm_hour | 时(0~23) | ||
tm_min | 分(0~59) | ||
tm_sec | 秒(0~61) |
time模块的常量和函数:
名称 | 说明 |
---|---|
模块常量 | |
tzname | 包含“本地时区”和“本地夏令时时区”的名称的元组。 |
timezone | 本地的(非夏令时)时区。 |
altzone | 夏令时期间使用的时区。 |
daylight | 如果定义了夏令时时区,它将被设为一个非0值。 |
函数 | |
time.time() | 返回当前UTC时间,形式是从“纪元开始”的秒数(浮点数)。 |
time.mktime(tuple) | 入参为一个struct_time对象(或类似的元组),将其转换为从“纪元开始”的秒数(浮点数)。如果输入的不是有效时间,将引发OverflowError异常。 |
time.ctime([secs]) | 将从“纪元开始”计算的秒数形式的时间,转换为代表本地时间的字符串。与asctime(localtime(secs))相同。如果省略入参secs,就会使用当前时间。 |
time.asctime([tuple]) | 将gmtime()或localtime()函数返回的时间元组,转换为'Mon Jan 1 12:00:00 2019'格式的字符串。如果省略入参secs,就会使用当前时间。 |
time.gmtime([secs]) | 将从“纪元开始”计算的秒数形式的时间,转换为UTC时间,返回为struct_time对象。如果省略入参secs,就会使用当前时间。 |
time.localtime([secs]) | 将从“纪元开始”计算的秒数形式的时间,转换为本地时区时间,返回为struct_time对象。如果省略入参secs,就会使用当前时间。 |
time.strftime(format [,tm]) | 将一个struct_time格式的时间,转换为format定义的字符串形式。 format格式说明 |
time.strptime(string [,format]) | 解析一个代表时间的字符串,然后返回一个struct_time对象。format格式默认为'%a %b %d %H:%M:%S %Y'。如果不能解析字符串,就会引发ValueError异常。 format格式说明 |
time.sleep(secs) | 让当前进程进入睡眠状态并持续secs秒钟,secs是一个浮点数。 |
time.tzset() | 基于UNIX上TZ环境变量的值重置时区设置。 |
● format 格式说明
指令 | 含义 | 指令 | 含义 |
---|---|---|---|
%Y | 年(四位数) | %c | 地区的日期时间完整表示,如:'Sat Jan 1 00:00:00 2000 ' |
%y | 年(2位数) | %x | 本地区的日期表示,如:'12/31/99' |
%m | 月(01~12) | %X | 本地区的时间表示,如:'01:02:03' |
%d | 日(01~31) | %a | 地区缩写形式的星期几字符串 |
%H | 时(00~23) | %A | 地区完整的星期几字符串 |
%I | 时(01~12) | %b | 地区缩写形式的月份字符串 |
%M | 分(00~59) | %B | 地区完整形式的月份字符串 |
%S | 秒(00~59) | %Z | 时区名称(如不存在则为空字符串) |
%p | 上午或下午(AM / PM) | %% | 百分号字符 |
%w | 星期几(0~6),0表示星期天 | ||
%j | 一年中第几天(001~366) | ||
%U | 一年中第几周(00~53),星期天为首日 | ||
%W | 一年中第几周(00~53),星期一为首日 |