赞
踩
本文介绍Python的datetime模块,是python常用的处理日期和时间的模块。
笔者也介绍了和datetime模块相关的time模块和calendar模块,学习本模块之前最好先学习time模块。
datetime模块包含六个类和两个常量。
六个类分别是:
date
:表示日期(年 月 日)time
:表示时间(时 分 秒 微秒)datetime
:表示日期和时间 (年 月 日 时 分 秒 微秒)timedelta
:表示时间间隔(日 秒 微秒)datetime_CAPI
:表示日期时间对象C语言接口tzinfo
:表示时区信息MAXYEAR
:能表示的最大年份,等于9999MINYEAR
:能表示的最小年份,等于1本文不介绍datetime_CAPI
和tzinfo
两个类。
date
类由年份、月份和日期三部分构成,包含year
、month
和day
三个仅读的表示具体日期的属性,定义如下:
class datetime.date(year, month, day)
其中:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 给定年月对应的天数
date对象有六个属性,分别是:year
、month
、day
、resolution
、max
、min
。
year
, month
, day
),如下:>>> import datetime
>>> a = datetime.date(2021, 2, 27)
>>> print(a.year, a.month, a.day)
2021 2 27
resolution
返回date对象表示日期的最小单位为1天(day)>>> a.resolution
datetime.timedelta(1)
max
表示date类能表示的最大的年、月、日的数值,自身也是一个date对象>>> a.max
datetime.date(9999, 12, 31)
min
表示date类能表示的最小的年、月、日的数值,自身也是一个date对象>>> a.min
datetime.date(1, 1, 1)
date有四种构造方法,这里介绍常用的三种:
import datetime
import time
a = datetime.date(2021, 2, 27) # 根据给定参数构造date对象
b = datetime.date.today() # 使用当前日期构造date对象
c = datetime.date.fromtimestamp(time.time()) # 根据给定的时间戳构造date对象
d = datetime.date.fromisoformat('2021-02-27') # 根据ISO标准的时间字符串构造date对象
上述代码中的datetime.date.today()
方法、datetime.date.fromtimestamp()
和datetime.date.fromisoformat()
方法都是使用@classmethod
修饰符的静态方法,返回类型为date
类。
用于日期比较的方法如下:
方法 | __eq__(..) | __ne__(..) | __ge__(..) | __gt__(..) | __le__(..) | __lt__(..) |
---|---|---|---|---|---|---|
说明 | 等于 | 不等于 | 大于等于 | 大于 | 小于等于 | 小于 |
示例如下:
>>> a = datetime.date(2021, 2, 27)
>>> b = datetime.date(2021, 2, 28)
>>> a.__eq__(b)
False
>>> a.__ne__(b)
True
>>> a.__ge__(b)
False
>>> a.__gt__(b)
False
>>> a.__le__(b)
True
>>> a.__lt__(b)
True
date
相差多少天方法如下:
方法 | __sub__(..) | __rsub__(..) |
---|---|---|
用法 | x.__sub__(y) | x.__rsub__(y) |
说明 | x - y | y - x |
两个方法的返回值都是datetime.timedelta
对象,下文会介绍。
示例如下:
>>> a = datetime.date(2021, 2, 27)
>>> b = datetime.date(2021, 2, 28)
>>> a.__sub__(b)
datetime.timedelta(-1)
>>> a.__rsub__(b)
datetime.timedelta(1)
date.__str__()
获取日期的字符串>>> a.__str__()
'2021-02-27'
date.ctime()
获取ctime样式的字符串>>> a.ctime()
'Sat Feb 27 00:00:00 2021'
date.__format__(..)
以指定格式进行日期输出,此方法等价于date.strftime(..)
方法,指定方式参考time模块第二章4.2节>>> a.__format__("%Y-%m-%d")
'2021-02-27'
>>> a.strftime("%Y-%m-%d")
'2021-02-27'
date.isocalendar()
获取一个包含三个值的元组,三个值分别是:year年份、week number周数、weekday星期数(周一为1 … 周日为7)date.isoformat()
返回符合ISO 8601标准(YYYY-MM-DD)的日期字符串date.isoweekday()
返回符合ISO标准的指定日期的星期数 (周一为1 … 周日为7)>>> a.isocalendar()
(2021, 8, 6)
>>> a.isoformat()
'2021-02-27'
>>> a.isoweekday()
6
date.weekday()
返回指定日期的星期数,和date.isoweekday()
的区别在于date.weekday()
默认周一为0而date.isoweekday()
默认周一为1>>> a.weekday()
5
>>> a.isoweekday()
6
date.timetuple()
返回当前日期的time.struct_time
格式,time.struct_time
中有关时间部分的属性置为0>>> a.timetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=58, tm_isdst=-1)
date.toordinal()
返回公元公历开始到指定日期的天数。公元1年1月1日为1>>> a.toordinal()
737848
date.replace()
返回一个替换指定日期部分字段的新date对象,不影响原对象>>> b = a.replace(2021, 3, 30)
>>> a
datetime.date(2021, 2, 27)
>>> b
datetime.date(2021, 3, 30)
time
类由小时、分钟、秒和微秒四部分构成,包含hour
、minute
、second
、microsecond
和tzinfo
五个表示时间的属性,本文只关注前四个仅读属性,定义如下:
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
所有参数都是可选的,其中:
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]
time对象总共有九个属性,分别是:hour
、minute
、second
、microsecond
、resolution
、max
、min
、tzinfo
、fold
,本文不关注tzinfo
和fold
。
>>> import datetime
>>> t = datetime.time(14, 57, 23, 1000)
>>> print(t.hour, t.minute, t.second, t.microsecond)
14 57 23 1000
resolution
返回time对象表示时间的最小单位为1微秒(microsecond)>>> t.resolution
datetime.timedelta(0, 0, 1)
max
表示time类能表示的最大的时间数值,自身也是一个time对象>>> t.max
datetime.time(23, 59, 59, 999999)
min
表示time类能表示的最小的时间数值,自身也是一个time对象>>> t.min
datetime.time(0, 0)
time有两种常用的构造方法:
import datetime
t = datetime.time(14, 57, 23, 1000) # 根据给定参数构造time对象
u = datetime.time.fromisoformat('00:05:23.283') # 根据ISO标准的时间字符串构造time对象
time类用于时间比较的方法和date相似,如下:
方法 | __eq__(..) | __ne__(..) | __ge__(..) | __gt__(..) | __le__(..) | __lt__(..) |
---|---|---|---|---|---|---|
说明 | 等于 | 不等于 | 大于等于 | 大于 | 小于等于 | 小于 |
time.__str__()
获取时间的字符串>>> t.__str__()
'14:57:23.001000'
time.__format__(..)
以指定格式进行时间输出,此方法等价于date.strftime(..)
方法,指定方式参考time模块第二章4.2节>>> t.__format__('%H:%M:%S:%f')
'14:57:23:001000'
>>> t.strftime('%H:%M:%S:%f')
'14:57:23:001000'
time.isoformat()
以ISO 8601格式输出时间字符串>>> t.isoformat()
'14:57:23.001000'
datetime
类可以看做是date
类和time
类的合体,由年份、月份、日期、小时、分钟、秒和微秒七部分构成,包含year
、month
、day
、hour
、minute
、second
、microsecond
和tzinfo
八个表示时间的属性,本文只关注前七个仅读属性,定义如下:
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
year
、month
和day
参数是必须的,其他参数都是可选的,其中:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 指定年月的天数
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]
datetime对象有十二个属性,分别是:year
、month
、day
、hour
、minute
、second
、microsecond
、resolution
、max
、min
、tzinfo
、fold
,本文不关注tzinfo
和fold
。。
year
, month
, day
),如下:>>> import datetime
>>> a = datetime.datetime(2021, 2, 27, 14, 57, 23, 124575)
>>> print(a.year, a.month, a.day, a.hour, a.minute, a.second, a.microsecond)
2021 2 27 14 57 23 124575
resolution
返回datetime对象表示表示时间的最小单位为1微秒(microsecond)>>> a.resolution
datetime.timedelta(0, 0, 1)
max
表示datetime类能表示的最大的年、月、日、时、分、秒、微秒的数值,自身也是一个datetime对象>>> a.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
min
表示datetime类能表示的最小的年、月、日、时、分、秒、微秒的数值,自身也是一个datetime对象>>> a.min
datetime.datetime(1, 1, 1, 0, 0)
datetime有多种构造方法,这里介绍常用的几种:
import datetime
import time
a = datetime.datetime(2021, 2, 27, 14, 57, 23, 124575) # 根据给定参数构造datetime对象
b = datetime.datetime.today() # 使用当前时间构造datetime对象
c = datetime.datetime.now() # 等价于datetime.datetime.today()
d = datetime.datetime.fromtimestamp(time.time()) # 根据给定的时间戳构造datetime对象
e = datetime.datetime.fromisoformat('2011-11-04 00:05:23.283258') # # 根据ISO标准的时间字符串构造datetime对象
f = datetime.datetime.strptime('2021-2-27 15:25', '%Y-%m-%d %H:%M') # 根据给定的时间字符串和格式说明构造datetime对象
datetime类用于时间比较的方法和date、time都相似,如下:
方法 | __eq__(..) | __ne__(..) | __ge__(..) | __gt__(..) | __le__(..) | __lt__(..) |
---|---|---|---|---|---|---|
说明 | 等于 | 不等于 | 大于等于 | 大于 | 小于等于 | 小于 |
datetime用于输出格式化时间的方法和date相似,不再单独介绍。
datetime对象的weekday()
方法、timetuple()
方法、replace()
方法及toordianl()
方法都和date对象用法相同,不再介绍,下面介绍datetime特有的方法。
date()
方法返回datetime对象的日期部分>>> a.date()
datetime.date(2021, 2, 27)
time()
方法返回datetime对象的时间部分>>> a.time()
datetime.time(14, 57, 23, 124575)
combine(..)
将一个date对象和一个time对象合并为一个datetime对象>>> a = datetime.date.today()
>>> b = datetime.time(14, 57, 23, 121547)
>>> datetime.datetime.combine(a, b)
datetime.datetime(2021, 2, 28, 14, 57, 23, 121547)
timedelta对象表示两个date对象或者两个datetime对象之间的时间间隔,由天数、秒数、微秒数三部分构成,days
、seconds
、microseconds
三个用于表示时间间隔的属性,定义如下:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
其中,milliseconds
参数、minutes
参数、hours
参数和weeks
参数会按如下换算规则转换为days
、seconds
、microseconds
:
1 millisecond(毫秒)= 1000 microseconds(微秒)
1 minute = 60 seconds
1 hour = 3600 seconds
1 week = 7 days
并且最终得到的days
、seconds
、microseconds
会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000(一秒的微秒数)
0 <= seconds < 3600*24 (一天的秒数)
-999999999 <= days <= 999999999
示例如下:
>>> import datetime
>>> delta = datetime.timedelta(
... days=50,
... seconds=27,
... microseconds=10,
... milliseconds=29000,
... minutes=5,
... hours=8,
... weeks=2
... )
>>> delta
datetime.timedelta(64, 29156, 10)
上述示例中,所有参数首先换算为days
、seconds
、microseconds
:
d
a
y
s
=
d
a
y
s
+
w
e
e
k
s
∗
7
=
64
,
s
e
c
o
n
d
s
=
s
e
c
o
n
d
s
+
m
i
n
u
t
e
s
∗
60
+
h
o
u
r
s
∗
60
∗
60
=
29127
,
m
i
c
r
o
s
e
c
o
n
d
s
=
m
i
c
r
o
s
e
c
o
n
d
s
+
m
i
l
l
i
s
e
c
o
n
d
s
∗
1000
=
29000010
days = days + weeks * 7 = 64, \\ seconds = seconds + minutes * 60 + hours * 60 * 60 = 29127, \\ microseconds = microseconds + milliseconds * 1000 = 29000010
days=days+weeks∗7=64,seconds=seconds+minutes∗60+hours∗60∗60=29127,microseconds=microseconds+milliseconds∗1000=29000010
在经过标准化处理:
m
i
c
r
o
s
e
c
o
n
d
s
=
m
i
c
r
o
s
e
c
o
n
d
s
−
1000000
∗
29
=
10
,
s
e
c
o
n
d
s
=
s
e
c
o
n
d
s
+
29
−
3600
∗
24
∗
0
=
29156
,
d
a
y
s
=
d
a
y
s
+
0
=
64
microseconds = microseconds - 1000000 * 29 = 10, \\ seconds = seconds + 29 - 3600 * 24 * 0 = 29156, \\ days = days + 0 = 64
microseconds=microseconds−1000000∗29=10,seconds=seconds+29−3600∗24∗0=29156,days=days+0=64
timedelta对象有六个属性,分别是:days
、seconds
、microseconds
、resolution
、max
、min
。
days
、seconds
、microseconds
),如下:>>> print(delta.days, delta.seconds, delta.microseconds)
64 29156 10
resolution
返回两个不相等的timedelta对象的最小间隔为1微秒(microseconds),自身也是一个timedelta对象>>> delta.resolution
datetime.timedelta(0, 0, 1)
max
表示timedelta类能表示的最大时间间隔,自身也是一个timedelta对象>>> delta.max
datetime.timedelta(999999999, 86399, 999999)
min
表示timedelta类能表示的最小时间间隔,自身也是一个timedelta对象>>> delta.min
datetime.timedelta(-999999999)
timedelta类只采用直接构造方法,上文已有举例,不再说明。
timedelta类支持date对象、datetime对象和timedelta对象之间的加、减、乘、除、求余等操作,下面是一个用法示例:
# 求3天3小时30秒之前的日期时间
>>> now = datetime.datetime.now()
>>> delta = datetime.timedelta(days=3, hours=3, seconds=30)
>>> now - delta
datetime.datetime(2021, 2, 26, 6, 21, 59, 861377)
更多的计算方式参考python官网。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。