一、模块介绍
datetime模块中包含如下类:
>>> import datetime
>>> dir(datetime)
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', 'tzinfo']
类名 | 功能说明 |
---|---|
datetime.date | 表示日期的类,常用属性:year, month, day |
datetime.time | 表示时间的类,常用属性:hour, minute, second, microsecond, tzinfo |
datetime.datetime | 表示日期和时间的类,常用属性: year, month, day, hour, minute, second, microsecond, tzinfo |
datetime.timedelta | 表示时间间隔,即两个时间点(date,time,datetime)之间的长度 |
datetime.timezone | 表示 UTC 时区的固定偏移,是 tzinfo 基类的实现 |
datetime.tzinfo | 表示时区的基类,为上方的 time 和 datetime 类提供调整的基准 |
datetime_CAPI | 日期时间对象C语言接口 |
二、类介绍
1. datetime.date
- date类对象
- date类有三个参数,datetime.date(year,month,day),返回year-month-day
datetime.date(year, month, day)
- 所有的参数都是必需的,参数可以是整数,并且在以下范围内:
MINYEAR <= year <= MAXYEAR(也就是 1 ~ 9999)
1 <= month <= 12
1 <= day <= 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)
- date类方法(classmethod)
>>> dir(datetime.date)
[‘add’, ‘class’, ‘delattr’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘ne’, ‘new’, ‘radd’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘rsub’, ‘setattr’, ‘sizeof’, ‘str’, ‘sub’, ‘subclasshook’, ‘ctime’, ‘day’, ‘fromisoformat’, ‘fromordinal’, ‘fromtimestamp’, ‘isocalendar’, ‘isoformat’, ‘isoweekday’, ‘max’, ‘min’, ‘month’, ‘replace’, ‘resolution’, ‘strftime’, ‘timetuple’, ‘today’, ‘toordinal’, ‘weekday’, ‘year’]
- date.today()
>>> datetime.date.today() #date.today()用法
datetime.date(2020, 2, 24)
>>> datetime.date.today().year
2020
>>> datetime.date.today().month
2
>>> datetime.date.today().day
24
>>> datetime.date.today().__getattribute__('year')
2020
>>> datetime.date.today().__getattribute__('month')
2
>>> datetime.date.today().__getattribute__('day')
24
-
datetime.date.ctime(arg)
参数arg是一个datetime.date对象,返回格式如:Mon Feb 24 00:00:00 2020
相当于 time 模块的 time.ctime(time.mktime(d.timetuple())) -
datetime.date.fromtimestamp(timestamp)
根据给定的时间戮,返回一个datetime.date对象。
>>> import datetime,time
>>> now_stamp = time.time()
>>> now_stamp
1582533478.5588923
>>> now = datetime.date.fromtimestamp(now_stamp)
>>> now
datetime.date(2020, 2, 24)
-
datetime.date.isocalendar(arg)
参数arg是一个datetime.date对象,返回一个三元组格式 (ISO year, week number, weekday) -
datetime.date.isoformat(a)
参数a是一个datetime.date对象,返回一个 ISO 8601 格式的日期字符串,如 “YYYY-MM-DD” 的字符串 -
datetime.date.isoweekday(date) 和 datetime.date.weekday(date)
datetime.date.isoweekday(a):参数a是一个datetime.date对象,返回给定日期的星期(1-7),星期一=1,星期日=7
datetime.date.weekday(b):参数b是一个datetime.date对象,返回给定日期的星期(0-6),星期一=0,星期日=6 -
datetime.date.strftime(a,format)
参数a是一个datetime.date对象,format格式看下面的日期时间格式化符号。把日期时间按照给定的format进行格式化。
日期格式化符号 | 说明 | 范围 |
---|---|---|
%Y | 四位数的年份 | 0000-9999 |
%m | 月份 | 01-12 |
%d | 月内中的一天 | 0-31 |
%H | 24小时制小时数 | 0-23 |
%M | 分钟数 | 00-59 |
%S | 秒 | 00-59 |
- datetime.date.timetuple(a)
参数a是一个datetime.date对象,返回日期对应的time.struct_time对象(类似于 time 模块 的 time.localtime())
>>> datetime.date.timetuple(datetime.date.today())
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=55, tm_isdst=-1)
- datetime.date.replace((year, month, day)
生成一个新的日期对象,用参数指定的年、月、日代替原有对象中的属性(但不改变原日期)
>>> now
datetime.date(2020, 2, 24)
>>> now.replace(day = 7)
datetime.date(2020, 2, 7)
>>> now
datetime.date(2020, 2, 24)
- datetime.date.fromordinal()和datetime.date.toordinal()
## 自日期 1.1.0001 之后的第 735678 天
>>> d = datetime.date.fromordinal(735678)
>>> d
datetime.date(2015, 3, 21)
>>> now = datetime.date(2020,12,31)
>>> datetime.date.toordinal(now) #计算从now到1.1.0001 过了几天
737790
2. datetime.time
- time类对象
time 对象表示一天中的一个时间,并且可以通过 tzinfo 对象进行调整。
datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
所有的参数都是可选的;tzinfo 可以是 None 或者 tzinfo 子类的实例对象;其余的参数可以是整数,并且在以下范围内:
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
注:如果参数超出范围,将引发 ValueError 异常
- time 类属性
time.min - time 对象所能表示的最早时间,time(0, 0, 0, 0)
time.max - time 对象所能表示的最晚时间,time(23, 59, 59, 999999)
time.resolution - time 对象表示时间的最小单位,在这里是 1 毫秒,timedelta(microseconds=1)
3. datetime.datetime
- datetime类对象
datetime 对象是 date 对象和 time 对象的结合体,并且包含他们的所有信息。
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]
必须的参数是 year(年)、month(月)、day(日);tzinfo 可以是 None 或者 tzinfo 子类的实例对象;其余的参数可以是整数,并且在以下范围内:
MINYEAR <= year <= MAXYEAR(也就是 1 ~ 9999)
1 <= month <= 12
1 <= day <= 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
注:如果参数超出范围,将引发 ValueError 异常
- datetime 类方法(classmethod)
>>> dir(datetime.datetime)
[‘add’, ‘class’, ‘delattr’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘ne’, ‘new’, ‘radd’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘rsub’, ‘setattr’, ‘sizeof’, ‘str’, ‘sub’, ‘subclasshook’, ‘astimezone’, ‘combine’, ‘ctime’, ‘date’, ‘day’, ‘dst’, ‘fold’, ‘fromisoformat’, ‘fromordinal’, ‘fromtimestamp’, ‘hour’, ‘isocalendar’, ‘isoformat’, ‘isoweekday’, ‘max’, ‘microsecond’, ‘min’, ‘minute’, ‘month’, ‘now’, ‘replace’, ‘resolution’, ‘second’, ‘strftime’, ‘strptime’, ‘time’, ‘timestamp’, ‘timetuple’, ‘timetz’, ‘today’, ‘toordinal’, ‘tzinfo’, ‘tzname’, ‘utcfromtimestamp’, ‘utcnow’, ‘utcoffset’, ‘utctimetuple’, ‘weekday’, ‘year’]
- datetime.today()
返回一个表示当前本地时间的 datetime 对象
>>> from datetime import datetime
>>> today = datetime.today()
>>> today
datetime.datetime(2020, 2, 25, 21, 10, 50, 795525)
>>> print(datetime.today())
2020-02-25 21:11:09.867502
>>> str(today)
'2020-02-25 21:10:50.795525'
- datetime.now(tz=None)
返回一个表示当前本地时间的 datetime 对象;如果提供了参数 tz,则获取 tz 参数所指时区的本地时间
>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2020, 2, 25, 21, 13, 31, 814895)
#返回当前日期时间的日期部分,返回值是一个datetime.date对象
>>> datetime.now().date()
datetime.date(2020, 2, 25)
#返回当前日期时间的时间部分 ,返回值是一个datetime.time对象
>>> datetime.now().time()
datetime.time(21, 42, 18, 451723)
- datetime.utcnow()
返回一个当前 UTC 时间的 datetime 对象
UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。
北京时区是东八区,领先UTC八个小时
>>> from datetime import datetime
>>> utc_now = datetime.utcnow()
>>> utc_now
datetime.datetime(2020, 2, 25, 13, 20, 52, 245685)
>>> print(utc_now)
2020-02-25 13:20:52.245685
>>> print(datetime.now())
2020-02-25 21:23:27.179176
- datetime.fromtimestamp(timestamp, tz=None)
根据时间戮创建一个 datetime 对象,参数 tz 指定时区信息
>>> from datetime import datetime
>>> import time
>>>> str(datetime.fromtimestamp(time.time()))
'2020-02-25 21:25:59.034310'
>>> datetime.fromtimestamp(time.time()).year
2020
- datetime.utcfromtimestamp(timestamp)
根据时间戮创建一个 UTC 时间的 datetime 对象 - datetime.fromordinal(integer) && datetime.toordinal(datetime.date)
## 自日期 1.1.0001 之后的第 735678 天
>>> print(datetime.fromordinal(735678))
2015-03-21 00:00:00
#计算从now到1.1.0001 过了几天
>>> print(datetime.toordinal(datetime.now()))
737480
- datetime.combine(date, time)
根据参数 date 和 time,创建一个 datetime 对象 - datetime.replace()
>>>from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2020-02-25 21:46:48.817810
>>> print(now.replace(day=28,hour=23,minute=59,second=59))
2020-02-28 23:59:59.817810
- datetime.strftime(date,format)
由日期格式转化为字符串格式。
>>>from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2020-02-25 21:51:01.522226
>>> print(datetime.strftime(now,'%Y%m%d%H%M%S'))
20200225215101
日期格式化符号 | 说明 | 范围 |
---|---|---|
%Y | 四位数的年份 | 0000-9999 |
%m | 月份 | 01-12 |
%d | 月内中的一天 | 0-31 |
%H | 24小时制小时数 | 0-23 |
%M | 分钟数 | 00-59 |
%S | 秒 | 00-59 |
%a | 本地简化星期名称 | |
%b | 本地简化的月份名称 | |
%d | 月内中的一天 | 0-31 |
- datetime.strptime((“时间字符串”,format)
将格式时间字符串转换为datetime对象
>>> from datetime import datetime
>>> datetime.strptime("2020-03-05 21:54","%Y-%m-%d %H:%M")
datetime.datetime(2020, 3, 5, 21, 54)
- datetime.timestamp(date)
返回指定时间的时间戳
>>> from datetime import datetime
>>> now = datetime.now()
>>> datetime.timestamp(now)
1582639315.625186
>>> print(datetime.fromtimestamp(datetime.timestamp(now)))
2020-02-25 22:01:55.625186
- 剩下的classmethod
>>> from datetime import datetime
>>> now = datetime.today()
>>> print(now)
2020-02-25 22:09:49.496281 #周二
>>>
>>> print(datetime.weekday(now)) #返回 0 ~ 6 表示星期几(星期一是 0,依此类推)
1
>>> print(datetime.isoweekday(now)) #返回 1 ~ 7 表示星期几(星期一是1, 依此类推)
2
>>> print(datetime.isocalendar(now)) #返回一个三元组格式 (ISO year, week number, weekday)
(2020, 9, 2)
>>>
>>> time_str = datetime.__str__(now) #对于 date 对象 d 来说,相当于 str(d)
>>> print(time_str,type(time_str))
2020-02-25 22:09:49.496281 <class 'str'>
>>> print(datetime.ctime(now)) #返回一个表示日期的字符串
Tue Feb 25 22:09:49 2020
4. datetime.timedelta
属性 | 取值范围 |
---|---|
timedelta.days | -999999999 ~ 999999999 |
timedelta.seconds | 0 ~ 86399 |
timedelta.microseconds | 0 ~ 999999 |
python使用datetime模块timedelta实现日期时间相加
>>> from datetime import datetime
>>> from datetime import timedelta
>>> now = datetime.now()
#计算天数差
>>> delta_day = timedelta(days=1)
>>> tomorrow = now + delta_day
>>> print(now);print(tomorrow)
2020-02-26 15:52:41.367867
2020-02-27 15:52:41.367867
#计算小时差
>>> delta_hour = timedelta(hours=3)
>>> next_hour = now + delta_hour
>>> print(now);print(next_hour)
2020-02-26 15:52:41.367867
2020-02-26 18:52:41.367867
#计算分钟差
>>> delta_minute = timedelta(minutes=10)
>>> next_minute = now + delta_minute
>>> print(now);print(next_minute)
2020-02-26 15:52:41.367867
2020-02-26 16:02:41.367867
#计算秒钟差
>>> delta_second = timedelta(seconds=30)
>>> next_second = now + delta_second
>>> print(now);print(next_second)
2020-02-26 15:52:41.367867
2020-02-26 15:53:11.367867
>>>
timedelta运算方法
>>> print(timedelta(days=1,hours=2,minutes=10))
1 day, 2:10:00
>>> print(timedelta(days=1,hours=2,minutes=10) + timedelta(weeks=1))
8 days, 2:10:00
>>> print(timedelta(minutes=10) // timedelta(minutes=3))
3 #得到一个int数值
>>> print(timedelta(minutes=10) / timedelta(minutes=3))
3.3333333333333335 #得到一个float数值
>>> print(timedelta(minutes=10) % timedelta(minutes=3))
0:01:00 #得到一个datetime.timedelta的值
>>> print(timedelta(minutes=10) *3 )
0:30:00 #得到一个datetime.timedelta的值
#repr() 函数将对象转化为供解释器读取的形式。
>>> print(repr(timedelta(days=1)))
datetime.timedelta(days=1)
>>> print(repr(timedelta(hours=1)))
datetime.timedelta(seconds=3600)
>>> print(repr(timedelta(minutes=10)))
datetime.timedelta(seconds=600)
#计算秒数
>>> print(datetime.timedelta(days=1).total_seconds())
86400.0