【万字长文】详解Python时间处理模块-datetime
共 2084字,需浏览 5分钟
·
2021-10-30 14:31
datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。
学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分。
import time time.time() 1625483470.3409266
二、datetime.date类
1、date类介绍
import datetimet = datetime.date(2019,8,26)print(type(t))print(t.day,t.month,t.year) # 26 8 2019
from datetime import date
print(dir(date))
['ctime', 'day', 'fromisocalendar', 'fromisoformat', 'fromordinal',
'fromtimestamp', 'isocalendar', 'isoformat', 'isoweekday', 'max',
'min', 'month', 'replace', 'resolution', 'strftime', 'timetuple',
'today', 'toordinal', 'weekday', 'year']
2、类方法
date.today()
from datetime import date date.today()datetime.date(2021, 7, 4)
date.fromtimestamp()
from datetime import date
date.fromtimestamp(1339119900000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromtimestamp(1339120800000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromordinal()
from datetime import date
d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
d
datetime.date(2002, 3, 11)
date.fromisoformat()
from datetime import date
date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
d.isoformat()
'2002-03-11'
date.fromisocalendar()
date.fromisocalendar(2021, 42, 3)
datetime.date(2021, 10, 20)
date.min
from datetime import date
date.min
datetime.date(1, 1, 1)
date.max
from datetime import date
date.max
datetime.date(9999, 12, 31)
date.resolution
from datetime import date
date.resolution
datetime.timedelta(days=1)
date.year
from datetime import date
d = date.today()#生成一个date对象
d
datetime.date(2021, 7, 5)
d.year
2021
date.month
#接上述案例
d.month
7
date.day
#接上述案例
d.day
5
3、实例方法
date.replace()
from datetime import date
d = date(2002, 12, 31)
d.replace(day=26)
datetime.date(2002, 12, 26)
date.timetuple()
d = date(2002, 12, 31)
date.timetuple(d)
time.struct_time(tm_year=2002, tm_mon=12, tm_mday=31,
tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=365,
tm_isdst=-1)
date.toordinal()
d = date(1, 1, 1)
d.toordinal()
1
d = date(2002, 12, 31)
d.toordinal()
731215
date.fromordinal(d.toordinal())
datetime.date(2002, 12, 31)
date.weekday()
date(2002, 12, 4).weekday()
2
date.isoweekday()
date(2002, 12, 4).isoweekday()
3
date.isocalendar()
from datetime import date
date(2003, 12, 29).isocalendar()
(2004, 1, 1) # 旧版本
datetime.IsoCalendarDate(year=2004, week=1, weekday=1) # 新版本
date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
date.isoformat()
from datetime import date
date(2021, 10, 1).isoformat()
'2021-10-01'
date.__str__()
from datetime import date
date(2021, 10, 1).__str__()
'2021-10-01'
str(date(2021, 10, 1))
'2021-10-01'
date.ctime()
from datetime import date
date(2021, 10, 1).ctime()
'Fri Oct 1 00:00:00 2021'
d=date(2021, 10, 1)
import time
time.ctime(time.mktime(d.timetuple()))
'Fri Oct 1 00:00:00 2021'
date.strftime()
import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.strftime("%Y-%m-%d")
'2021-10-01'
dt.strftime("%Y年%m月%d日")
'2021年10月01日'
dt.strftime("%Y//%m//%d")
'2021//10//01'
dt.strftime("%Y-%m-%d %H:%M")
'2021-10-01 00:00'
dt.strftime("%A, %d. %B %Y %I:%M%p")
'Friday, 01. October 2021 12:00AM'
date.__format__(format)
import datetimedt=datetime.date(2021, 10, 1)
#创建一个日期对象dt.__format__("%Y年%m月%d日")'2021年10月01日'
4、支持的运算
三、datetime.time类
1、time类概述
作用:一个 time 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。
语 法:
datetime.time(hour=0, minute=0, second=0, microsecond=0,
tzinfo=None, *, fold=0)
参 数:
所有参数都是可选的,tzinfo 可以是 None,或者是一个 tzinfo 子类的实例。 其余的参数必须是在下面范围内的整数:
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]
如果给出一个此范围以外的参数,则会引发 ValueError。 所有参数值默认为 0,只有 tzinfo 默认为 None。
通过内置函数dir,可以查看time类的所有方法和属性
from datetime import time
print(dir(time))
['dst', 'fold', 'fromisoformat', 'hour', 'isoformat', 'max',
'microsecond', 'min', 'minute', 'replace', 'resolution',
'second', 'strftime', 'tzinfo', 'tzname', 'utcoffset']
2、time类属性
time.min
早最的可表示 time, time(0, 0, 0, 0)。
from datetime import time
time.min
datetime.time(0, 0)
time.max
最晚的可表示 time, time(23, 59, 59, 999999)。
from datetime import time
time.max
datetime.time(23, 59, 59, 999999)
time.resolution
两个不相等的 time 对象之间可能的最小间隔,timedelta(microseconds=1),但是请注意 time 对象并不支持算术运算。
from datetime import time
time.resolution
datetime.timedelta(microseconds=1)
3、time类实例属性
time.hour
取值范围是 range(24)。
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.hour
12
time.minute
取值范围是 range(60)。
t.minute
34
time.second
取值范围是 range(60)。
t.second
56
time.microsecond
取值范围是 range(1000000)。
t.microsecond
123456
time.tzinfo
作为 tzinfo 参数被传给 time 构造器的对象,如果没有传入值则为 None。
t.tzinfo
time.fold
取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。
t.fold
0
4、time类实例方法
time.replace()
作用:返回一个具有同样属性值的 time,除非通过任何关键字参数指定了某些属性值。
语法:time.replace(hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.replace(hour=23, minute=12,)
datetime.time(23, 12, 56, 123456)
time.isoformat()
作用:返回表示为 ISO 8601 格式之一的时间字符串
语法:time.isoformat(timespec='auto')
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
t.isoformat()
'12:34:56.123456'
t.isoformat(timespec='minutes')
'12:34'
dt = time(hour=12, minute=34, second=56, microsecond=0)
dt.isoformat(timespec='microseconds')
'12:34:56.000000'
dt.isoformat(timespec='auto')
'12:34:56'
time.fromisoformat()
作用:返回对应于 time.isoformat() 所提供的某种 time_string 格式的 time。 特别地,此函数支持以下格式的字符串:HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
语法:time.fromisoformat(time_string)
time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
time.fromisoformat('04:23:01+04:00')
datetime.time(4,23,1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
time.__str__()
作用:对于时间对象 t, str(t) 等价于 t.isoformat()
语法:time.__str__(t)
from datetime import time
t = time(hour=12, minute=34, second=56, microsecond=123456)
time.__str__(t)
'12:34:56.123456'
str(t)
'12:34:56.123456'
time.strftime()
作用:时间->字符串,返回一个由显式格式字符串所指明的代表时间的字符串
语法:time.strftime(format)
from datetime import time
t = time(hour=12, minute=3, second=56)
t.strftime('%H:%M:%S')
#用:分隔
'12:03:56'
#用%分隔
t.strftime('%H%%%M%%%S')
'12%03%56'
time.__format__()
作用:与 time.strftime() 相同
语法:time.__format__(format)
from datetime import time
t = time(hour=12, minute=3, second=56)
t.__format__('%H:%M:%S')
'12:03:56'
t.__format__('%H%%%M%%%S')
'12%03%56'
time.utcoffset()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.utcoffset(None),并且在后者不返回 None 或一个幅度小于一天的 a timedelta 对象时将引发异常。
time.dst()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.dst(None),并且在后者不返回 None 或者一个幅度小于一天的 timedelta 对象时将引发异常。
time.tzname()
作用:如果 tzinfo 为 None,则返回 None,否则返回 self.tzinfo.tzname(None),如果后者不返回 None 或者一个字符串对象则将引发异常。
from datetime import time, tzinfo, timedelta
class TZ1(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=1)
def dst(self, dt):
return timedelta(0)
def tzname(self,dt):
return "+01:00"
def __repr__(self):
return f"{self.__class__.__name__}()"
t = time(12, 10, 30, tzinfo=TZ1())
t
datetime.time(12, 10, 30, tzinfo=TZ1())
t.isoformat()
'12:10:30+01:00'
t.dst()
datetime.timedelta(0)
t.tzname()
'+01:00'
t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
四、datetime.datetime类
1、datetime概述
作用:date类可以同时获得日期和时间信息,datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。与 date 对象一样,datetime 假定当前的格列高利历向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。
语法:
datetime.datetime(year, month, day, hour=0, minute=0, second=0,
microsecond=0, tzinfo=None, *, fold=0)
参数:year, month 和 day 参数是必须的。 tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。 其余的参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR,
1 <= month <= 12,
1 <= day <= 指定年月的天数,
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
如果参数不在这些范围内,则抛出 ValueError 异常。
注意:microsecond-微秒,百万分之一秒
datetime类是date和time的结合体,包括date与time的所有信息,date和time类中具有的方法和属性,datetime类都具有。我们可以使用内置函数dir查看该模块支持的方法
print(dir(datetime.datetime))
[ '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']
2、datetime类方法
datetime.today()
作用:获取今天的时间,返回datetime对象,其中 tzinfo 为 None。 此方法的功能等价于 now(),但是不带 tz 形参。
语法:datetime.datetime.today(tz=None )
from datetime import datetime
datetime.today()
datetime.datetime(2021, 7, 5, 17, 58, 21, 359135)
注:359135,microsecond-微秒,百万分之一秒
datetime.now()
作用:返回当前时间,返回datetime对象。
语法:datetime.datetime.now(tz=None )
from datetime import datetime
#获取现在时间
datetime.now()
datetime.datetime(2021, 6, 27, 21, 59, 53, 950783)
#调整下格式
datetime.now().strftime('%Y-%m-%d %H:%M:%S')
'2021-06-27 22:01:49'
datetime.utcnow()
作用:返回表示当前 UTC 时间的 date 和 time,其中 tzinfo 为 None。
语法:datetime.utcnow()
from datetime import datetime
datetime.utcnow()
datetime.datetime(2021, 7, 6, 2, 46, 7, 229768)
datetime.now()
datetime.datetime(2021, 7, 6, 10, 46, 3, 67817)
可以看到,now()与相差了差不多8小时
datetime.fromtimestamp()
作用: 将时间戳表示为本地时间的简单日期时间对象, 如果可选参数 tz 为 None 或未指定,时间戳会被转换为所在平台的本地日期和时间,返回的 datetime 对象将为天真型。
语法:datetime.datetime.fromtimestamp(timestamp, tz=None)
import time
import datetime
tt = time.time()
tt
1625542045.2471695
datetime.datetime.fromtimestamp(tt)
7, 6, 11, 27, 25, 247169)
#取整数后,精确到秒,否则精确到微秒,一微秒=百万分之一秒
datetime.datetime.fromtimestamp(1625542045)
7, 6, 11, 27, 25)
#例如,使用日期2008-12-27午夜UTC(自纪元起40*356*86400秒)
* 356 * 86400)
12, 27, 1, 0)
datetime.utcfromtimestamp()
作用:将时间戳表示为本地时间的UTC日期时间对象
语法:datetime.datetime.utcfromtimestamp(timestamp)
import datetime
#获取本地当前时间
dt=datetime.datetime.now()
#获取时间戳
dt.timestamp()
1625549035.048533
datetime.datetime.utcfromtimestamp(dt.timestamp())
datetime.datetime(2021, 7, 6, 5, 23, 55, 48533)
datetime.fromordinal()
作用:返回对应于预期格列高利历序号的 datetime,其中公元 1 年 1 月 1 日的序号为 1。 除非 1 <= ordinal <= datetime.max.toordinal() 否则会引发 ValueError。 结果的 hour, minute, second 和 microsecond 值均为 0,并且 tzinfo 值为 None。
语法:datetime.fromordinal(ordinal)
datetime.datetime.fromordinal(730920)
datetime.datetime(2002, 3, 11, 0, 0)
datetime.combine()
作用:返回一个date对象和一个time对象合成的date对象, 如果提供了 tzinfo 参数,其值会被用来设置结果的 tzinfo 属性,否则将使用 time 参数的 tzinfo 属性。
语法:datetime.combine(date, time, tzinfo=self.tzinfo)
d = date(2005, 7, 14)
t = time(12, 30)
datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
对于任意 datetime 对象 d,d = datetime.combine(d.date(), d.time(), d.tzinfo)。 如果 date 是一个 datetime 对象,它的时间部分和 tzinfo 属性会被忽略。
datetime.fromisoformat()
作用:返回一个对应于 date.isoformat() 和 datetime.isoformat() 所提供的某一种 date_string 的 datetime 对象。 特别地,此函数支持以下格式的字符串:YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]],其中 * 可以匹配任意的单个字符。
语法:datetime.fromisoformat(date_string)
from datetime import datetime
datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
datetime.fromisocalendar()
作用:返回以 year, week 和 day 值指明的 ISO 历法日期所对应的 datetime。 该datetime 对象的非日期部分将使用其标准默认值来填充。 这是函数 datetime.isocalendar() 的逆操作。
语法:datetime.fromisocalendar(year, week, day)
from datetime import datetime
datetime.fromisocalendar(2021, 10, 1)
datetime.datetime(2021, 3, 8, 0, 0)
datetime.strptime()
作用:按照特定时间格式将字符串转换(解析)为时间类型。返回一个由显式格式字符串所指明的代表时间的字符串。 要获取格式指令的完整列表,请参阅 strftime() 和 strptime() 的行为。
语法:datetime.strptime(date_string, format)
dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
dt
datetime.datetime(2006, 11, 21, 16, 30)
3、类属性
datetime.min
最早的可表示 datetime,datetime(MINYEAR, 1, 1, tzinfo=None)。
from datetime import datetime
datetime.min
datetime.datetime(1, 1, 1, 0, 0)
datetime.max
最晚的可表示 datetime,
datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)。
from datetime import datetime
datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
datetime.resolution
两个不相等的 datetime 对象之间可能的最小间隔,timedelta(microseconds=1)。
from datetime import datetime
datetime.resolution
datetime.timedelta(microseconds=1)
4、实例属性-只读
datetime.year
在 MINYEAR 和 MAXYEAR 之间,包含边界。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).year
2021
datetime.month
1 至 12(含)
from datetime import datetime
datetime(2021,5,20,13,14,0,0).month
5
datetime.day
返回1到指定年月的天数间的数字。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).day
20
datetime.hour
取值范围是 range(24)。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).hour
13
datetime.minute
取值范围是 range(60)。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).minute
14
datetime.second
取值范围是 range(60)。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).second
0
datetime.microsecond
取值范围是 range(1000000)。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).microsecond
0
datetime.tzinfo
作为 tzinfo 参数被传给 datetime 构造器的对象,如果没有传入值则为 None。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).fold
datetime.fold
取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).fold
0
5、datetime实例方法
datetime.date()
作用:返回具有同样 year, month 和 day 值的 date 对象。
用法:datetime.date()
datetime(2021,5,20,13,14,0,0).date()
datetime.date(2021, 5, 20)
datetime.time()
作用:返回具有同样 hour, minute, second, microsecond 和 fold 值的 time 对象。 tzinfo 值为 None。 另请参见 timetz() 方法。
用法:datetime.time()
datetime(2021,5,20,13,14,0,0).time()
datetime.time(13, 14)
datetime.timetz()
作用:返回具有同样 hour, minute, second, microsecond, fold 和 tzinfo 属性性的 time 对象。 另请参见 time() 方法。
用法:datetime.timetz()
datetime(2021,5,20,13,14,0,0).timetz()
datetime.time(13, 14)
datetime.replace()
作用:返回一个具有同样属性值的 datetime,除非通过任何关键字参数为某些属性指定了新值。 请注意可以通过指定 tzinfo=None 来从一个感知型 datetime 创建一个简单型 datetime 而不必转换日期和时间数据。
用法:datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour,
minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
from datetime import datetime
datetime(2021,5,20,13,14,0,0).replace(year=2035, month=12)
datetime.datetime(2035, 12, 20, 13, 14)
datetime.astimezone()
作用:返回一个具有新的 tzinfo 属性 tz 的 datetime 对象,并会调整日期和时间数据使得结果对应的 UTC 时间与 self 相同,但为 tz 时区的本地时间。
用法:datetime.astimezone(tz=None)
def astimezone(self, tz):
if self.tzinfo is tz:
return self
# Convert self to UTC, and attach the new time zone object.
utc = (self - self.utcoffset()).replace(tzinfo=tz)
# Convert from UTC to tz's local time.
return tz.fromutc(utc)
datetime.timetuple()
返回一个 time.struct_time,即 time.localtime() 所返回的类型。
from datetime import datetime
datetime(2021,5,20,13,14,0,0).timetuple()
time.struct_time(tm_year=2021, tm_mon=5, tm_mday=20, tm_hour=13,
tm_min=14, tm_sec=0, tm_wday=3, tm_yday=140, tm_isdst=-1)
datetime.utctimetuple()
作用:如果 datetime 实例 d 为简单型,这类似于 d.timetuple(),不同之处在于 tm_isdst 会强制设为 0,无论 d.dst() 返回什么结果。 DST 对于 UTC 时间永远无效。返回UTC时间元组
语法:datetime对象.utctimetuple()
from datetime import datetime
datetime(2021,5,20,13,14,0,0).utctimetuple()
time.struct_time(tm_year=2021, tm_mon=5, tm_mday=20, tm_hour=13,
tm_min=14, tm_sec=0, tm_wday=3, tm_yday=140, tm_isdst=0)
datetime.toordinal()
作用:返回日期的预期格列高利历序号。 与 self.date().toordinal() 相同。
用法:datetime.toordinal()
datetime(2021, 5, 4).toordinal()
737914
datetime.timestamp()
作用:返回对应于 datetime 实例的 POSIX 时间戳。 此返回值是与 time.time() 返回值类似的 float 对象。
用法:datetime.timestamp()
from datetime import datetime
datetime(2021, 5, 4).timestamp()
1620057600.0
datetime.weekday()
作用:返回一个整数代表星期几,星期一为 0,星期天为 6。 相当于 self.date().weekday()。 另请参阅 isoweekday()。
用法:datetime.weekday()
import datetime
datetime.datetime(2021, 5, 4).weekday()
1
datetime.isoweekday()
作用:返回一个整数代表星期几,星期一为 1,星期天为 7。 相当于 self.date().isoweekday()。 另请参阅 weekday(), isocalendar()。
用法:datetime.isoweekday()
import datetime
datetime.datetime(2021, 5, 4).isoweekday()
2
datetime.isocalendar()
作用:返回一个由三部分组成的元组: year, week 和 weekday,哪一年、第几周和、周几,等同于 self.date().isocalendar()。
用法:datetime.isocalendar()
import datetime
dt = datetime.datetime.now()
print(dt)
2021-07-06 14:22:35.920877
dt.isocalendar()
(2021, 27, 2)
datetime.isoformat()
作用:返回一个以 ISO 8601 格式表示的日期和时间字符串
用法:datetime.isoformat(sep='T', timespec='auto')
from datetime import datetime, timezone
datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
'2019-05-18T15:17:08.132263'
datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat()
'2019-05-18T15:17:00+00:00'
datetime.__str__()
作用:对于 datetime 实例 d,str(d) 等价于 d.isoformat(' ')。
语法:datetime.__str__(d)
from datetime import datetime
# __str__
datetime.__str__(datetime(2019, 5, 18, 15, 17, 8, 132263))
'2019-05-18 15:17:08.132263'
# str
str(datetime(2019, 5, 18, 15, 17, 8, 132263))
'2019-05-18 15:17:08.132263'
datetime.ctime()
作用:返回一个表示日期和时间的字符串,输出字符串将 并不 包括时区信息,无论输入的是感知型还是简单型。
用法:datetime.ctime()
from datetime import datetime
datetime(2002, 12, 4, 20, 30, 40).ctime()
'Wed Dec 4 20:30:40 2002'
#d.ctime() 等效于:
time.ctime(time.mktime(d.timetuple()))
在原生 C ctime() 函数 (time.ctime() 会发起调用该函数,但 datetime.ctime() 则不会) 遵循 C 标准的平台上。
datetime.strftime()
作用:将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制日期时间对象的输出格式,date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。要获取格式指令的完整列表,查看文末列表。
用法:datetime.strftime(format)
import datetime
dt=datetime.datetime(2006, 11, 21, 16, 30)
dt.strftime("%Y-%m-%d %H:%M")
'2006-11-21 16:30'
dt.strftime("%Y-%m-%d")
'2006-11-21'
dt.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
对比:
strftime: 将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式
strptime:将字符串解析为给定格式的日期时间对象。字符串=>日期时间对象,解析字符串
strftime | strptime | |
用法 | 根据给定的格式将对日期时间象转换为字符串 | 将字符串解析为给定相应格式的datetime 对象 |
类型 | 实例方法 | 类方法 |
方法 | date; datetime; time | datetime |
用法 | strftime(format) | strptime(date_string, format) |
示例 | datetime.datetime(2006, 11, 21, 16, 30) => '2006-11-21 16:30' | "21/11/06 16:30" => datetime.datetime(2006, 11, 21, 16, 30) |
datetime.__format__()
作用:与 datetime.strftime() 相同。
语法:datetime.__format__(format)
import datetime
dt=datetime.datetime(2006, 11, 21, 16, 30)
dt.__format__("%Y-%m-%d %H:%M")
'2006-11-21 16:30'
五、datetime.timedelta
1、模块概述
作用:timedelta 对象表示两个 date 或者 time 的时间间隔。
语法:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
minutes=0, hours=0, weeks=0)
参数:只有 days, seconds 和 microseconds 会存储在内部。 参数单位的换算规则如下:
1毫秒会转换成1000微秒。
1分钟会转换成60秒。
1小时会转换成3600秒。
1星期会转换成7天。
并且 days, seconds, microseconds 会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000
0 <= seconds < 3600*24 (一天的秒数)
-999999999 <= days <= 999999999
下面的例子演示了如何对 days, seconds 和 microseconds 以外的任意参数执行“合并”操作并标准化为以上三个结果属性
from datetime import timedelta
delta = timedelta(days=50,seconds=27,microseconds=10,milliseconds=29000,
minutes=5,hours=8,weeks=2)
#只有 days, seconds 和 microseconds 会存储在内部,其他会被转换
delta
64, seconds=29156, microseconds=10) =
通过dir查看该类的方法和属性
import datetime
dir(datetime.timedelta)
['days','max','microseconds', 'min', 'resolution', 'seconds',
'total_seconds']
2、类属性
timedelta.min
The most negative timedelta object, timedelta(-999999999).
from datetime import timedelta
timedelta.min
datetime.timedelta(days=-999999999)
timedelta.max
from datetime import timedelta
timedelta.max
datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
timedelta.resolution
两个不相等的 timedelta 类对象最小的间隔为 timedelta(microseconds=1)。
需要注意的是,因为标准化的缘故,timedelta.max > -timedelta.min,-timedelta.max 不可以表示一个 timedelta 类对象。
from datetime import timedelta
timedelta.resolution
datetime.timedelta(microseconds=1)
3、实例属性(只读)
timedelta.days
-999999999 至 999999999 ,含999999999
from datetime import timedelta
delta = timedelta(days=50,seconds=27,microseconds=10,milliseconds=29000,
minutes=5,hours=8,weeks=2)
delta
64, seconds=29156, microseconds=10) =
delta.days
64
timedelta.seconds
0 至 86399,包含86399
delta.seconds
29156
timedelta.microseconds
0 至 999999,包含999999
delta.microseconds
10
4、实例方法
timedelta.total_seconds()
作用:返回时间间隔包含了多少秒。等价于 td / timedelta(seconds=1)。对于其它单位可以直接使用除法的形式 (例如 td / timedelta(microseconds=1))。
需要注意的是,时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)。
from datetime import timedelta
year = timedelta(days=1)
timedelta.total_seconds(year)
86400.0
5、支持的运算
运算 | 结果 |
t1 = t2 + t3 | t2 和 t3 的和。 运算后 t1-t2 == t3 and t1-t3 == t2 必为真值。(1) |
t1 = t2 - t3 | t2 减 t3 的差。 运算后 t1 == t2 - t3 and t2 == t1 + t3 必为真值。 (1)(6) |
t1 = t2 * i or t1 = i * t2 | 乘以一个整数。运算后假如 i != 0 则 t1 // i == t2 必为真值。 |
In general, t1 * i == t1 * (i-1) + t1 is true. (1) | |
t1 = t2 * f or t1 = f * t2 | 乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。 |
f = t2 / t3 | 总时间 t2 除以间隔单位 t3 (3)。 返回一个 float 对象。 |
t1 = t2 / f or t1 = t2 / i | 除以一个浮点数或整数。 结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。 |
t1 = t2 // i or t1 = t2 // t3 | 计算底数,其余部分(如果有)将被丢弃。在第二种情况下,将返回整数。 (3) |
t1 = t2 % t3 | 余数为一个 timedelta 对象。(3) |
q, r = divmod(t1, t2) | 通过 : q = t1 // t2 (3) and r = t1 % t2 计算出商和余数。q是一个整数,r是一个 timedelta 对象。 |
+t1 | 返回一个相同数值的 timedelta 对象。 |
-t1 | 等价于 timedelta(-t1.days, -t1.seconds, -t1.microseconds), 和 t1* -1. (1)(4) |
abs(t) | 当 t.days >= 0``时等于 +\ *t*, 当 ``t.days < 0 时 -t 。 (2) |
str(t) | 返回一个形如 [D day[s], ][H]H:MM:SS[.UUUUUU] 的字符串,当 t 为负数的时候, D 也为负数。 (5) |
repr(t) | 返回一个 timedelta 对象的字符串表示形式,作为附带正规属性值的构造器调用。 |
注:
1)结果正确,但可能会溢出。
2)结果正确,不会溢出。
3)除以0将会抛出异常 ZeroDivisionError 。
4)-timedelta.max 不是一个 timedelta 类对象。
5)timedelta 对象的字符串表示形式类似于其内部表示形式被规范化。对于负时间增量,这会导致一些不寻常的结果。例如:
timedelta(hours=-5)
datetime.timedelta(days=-1, seconds=68400)
print(_)
-1 day, 19:00:00
6)表达式 t2 - t3 通常与 t2 + (-t3) 是等价的,除非 t3 等于 timedelta.max; 在这种情况下前者会返回结果,而后者则会溢出。
from datetime import timedelta
year = timedelta(days=365)
ten_years = 10 * year
ten_years
datetime.timedelta(days=3650)
ten_years.days // 365
10
nine_years = ten_years - year
nine_years
datetime.timedelta(days=3285)
three_years = nine_years // 3
three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
六、datetime.tzinfo(时区)
class datetime.tzinfo
这是一个抽象基类,也就是说该类不应被直接实例化。 请定义 tzinfo 的子类来捕获有关特定时区的信息。
七、datetime.timezone
timezone 类是 tzinfo 的子类,它的每个实例都代表一个以与 UTC 的固定时差来定义的时区。
八、常量模块
datetime.MINYEAR
date 或者 datetime 对象允许的最小年份。 常量 MINYEAR 是 1 。
import datetime
datetime.MINYEAR
1
datetime.MAXYEAR
date 或 datetime 对象允许最大的年份。常量 MAXYEAR 是 9999 。
import datetime
datetime.MAXYEAR
9999
··· END ···