【万字长文】详解Python时间处理模块-datetime

共 2084字,需浏览 5分钟

 ·

2021-11-04 19:45

datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。
学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分。
日期:年月日,如 20210612
时间:时分秒,如 20:45:50
Python标准库中包含日期(date)和时间(time)的数据类型,还有日历方面的功能。要比较系统的学习该模块,需要了解下面的两个概念。
UTC(全球标准时间):是全球范围内计时的科学标准,它基于精心维护的原子钟,在全球范围内精确到微秒,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。作为全球最精确的时间系统,天文学家、航海家、“太空跟踪网”(DSN) 以及其他科学性学科都使用它,它的参考点是英国格林威治标准时间(GMT):地球本初子午线的午夜,也是 UTC 的午夜 (00:00:00.000000)。本地时间是根据地球上不同时区所处的位置调整 UTC 得来的,比如当美国加州的太平洋时间为正午 12:00:00 时,UTC 为 20:00:00。
夏令时(DST):表示为了节约能源, 人为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),又称"日光节约时制"和"夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。
感知型”和“简单型”对象:日期和时间对象可以根据它们是否包含时区信息而分为“感知型”和“简单型”两类。充分掌握应用性算法和政治性时间调整信息例如时区和夏令时的情况下,一个 感知型 对象就能相对于其他感知型对象来精确定位自身时间点。感知型对象是用来表示一个没有解释空间的固定时间点。简单型对象没有包含足够多的信息来无歧义地相对于其他 date/time 对象来定位自身时间点。
时间戳:Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)
import time time.time() 1625483470.3409266

一、datetime模块概
Python内置的时间模块datetime包含下面的模块包含六个类和两个常数,提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求,且这些类型的对象都是不可变的。最常用的是datetime.datetime,有些人误以为就一个模块,其实是datetime模块下的datetime类。

常量、类或方法名
注解
datetime.date
一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。属性包含: year, month, day。
datetime.time
一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24*60*60 秒。这里没有“闰秒”的概念) 包含属性:hour、minute、second、microsecond 、tzinfo。
datetime.datetime
是日期和时间的结合,属性包含year、month、day、hour、minute、second、 microsecond、 tzinfo.表示日期时间
datetime.timedelta
表示两个 date 对象或者 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。
datetime.tzinfo
一个描述时区信息对象的抽象基类。用来给datetime和time类提供自定义的时间调整概念(例如处理时区和/或夏令时)。
datetime.timezone
一个实现了tzinfo抽象基类的子类,用于表示相对于世界标准时间(UTC)的偏移量。
datetime.MINYEAR
常量,表示年份允许的最小值为1
datetime.MAXYEAR
常量,表示年份允许的最大值为9999
书接上回,接着写

二、datetime.date类

1、date类介绍

作用:date类用来处理日期信息
语法:date类是datetime的内嵌类,实例化语法:datetime.date(year, month, day)
参数:year年份、month月份及day日期,所有参数都是必要的, 参数必须是在下面范围内的整数
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day<= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常。
import datetimet = datetime.date(2019,8,26)print(type(t))print(t.day,t.month,t.year) # 26 8 2019
通过内置函数dir,可以查看date类的所有方法和属性
from datetime import dateprint(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()

作用:返回当前的本地日期,等价于date.fromtimestamp(time.time())。
from datetime import date date.today()datetime.date(202174)

date.fromtimestamp()

作用:返回对应于POSIX时间戳的当地时间,例如 time.time() 返回的就是时间戳。这可能引发 OverflowError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并且会在 localtime() 出错时引发 OSError。通常该数值会被限制在 1970 年至 2038 年之间。请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 fromtimestamp() 所忽略。
在 3.3 版更改: 引发 OverflowError 而不是 ValueError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并会在 localtime() 出错时引发 OSError 而不是 ValueError。
用法:date.fromtimestamp(timestamp)
from datetime import datedate.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'
注意: unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
 

date.fromordinal()

作用:返回对应于预期格列高利历序号的日期,其中公元 1 年 1 月 1 晶的序号为 1。
用法:date.fromordinal(ordinal)
from datetime import dated = date.fromordinal(730920) # 730920th day after 1. 1. 0001ddatetime.date(2002, 3, 11)
 

date.fromisoformat()

作用:返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象
用法:date.fromisoformat(date_string)
from datetime import datedate.fromisoformat('2019-12-04')datetime.date(2019, 12, 4)
这是 date.isoformat() 的逆操作。它只支持 YYYY-MM-DD 格式。更通用的要用strptime
d.isoformat()'2002-03-11'

date.fromisocalendar()

作用:返回指定 year, week 和 day 所对应 ISO 历法日期的 date。这是函数 date.isocalendar() 的逆操作。
用法:date.fromisocalendar(year, week, day)
今年的42周第三天是10月20号
date.fromisocalendar(2021, 42, 3)datetime.date(2021, 10, 20)
 
3、类属性

date.min

最小的日期 date(MINYEAR, 1, 1) 。
from datetime import datedate.mindatetime.date(1, 1, 1)

date.max

最大的日期 ,date(MAXYEAR, 12, 31)。
from datetime import datedate.maxdatetime.date(9999, 12, 31)

date.resolution

两个日期对象的最小间隔,timedelta(days=1)。
from datetime import datedate.resolutiondatetime.timedelta(days=1)

date.year

在 MINYEAR 和 MAXYEAR 之间,包含边界
from datetime import date d = date.today()#生成一个date对象ddatetime.date(2021, 7, 5)d.year2021

date.month

1 至 12(含)
#接上述案例d.month7

date.day

返回1到指定年月的天数间的数字。
#接上述案例d.day5
 

3、实例方法

date.replace()

作用:返回一个具有同样值的日期,除非通过任何关键字参数给出了某些形参的新值。
用法:date.replace(year=self.year, month=self.month, day=self.day)
from datetime import dated = date(2002, 12, 31)d.replace(day=26)datetime.date(2002, 12, 26)

date.timetuple()

作用:返回一个 time.struct_time,即 time.localtime() 所返回的类型。hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。
用法:date.timetuple(d)
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()

作用:返回日期的预期格列高利历序号,其中公元 1 年 1 月 1 日的序号为 1。对于任意 date 对象 d,date.fromordinal(d.toordinal()) == d。
d = date(1, 1, 1)d.toordinal()1d = date(2002, 12, 31)d.toordinal()731215date.fromordinal(d.toordinal())datetime.date(2002, 12, 31)
 

date.weekday()

作用:返回一个整数代表星期几,星期一为0,星期天为6。
date(2002, 12, 4).weekday()2

date.isoweekday()

作用:返回一个整数代表星期几,星期一为1,星期天为7。
date(2002, 12, 4).isoweekday()3

date.isocalendar()

作用:返回一个由三部分组成的 named tuple 对象: year, week 和 weekday。
ISO 历法是一种被广泛使用的格列高利历。ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。一个 ISO 年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。
例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日.
from datetime import datedate(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)
在 3.9 版更改: 结果由元组改为 named tuple。
 

date.isoformat()

作用:返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
用法:date.isoformat(d)
from datetime import datedate(2021, 10, 1).isoformat()'2021-10-01'
这是 date.fromisoformat() 的逆操作。
 

date.__str__()

作用:对于日期对象 d, str(d) 等价于 d.isoformat() 。
用法:date.__str__(d)
from datetime import datedate(2021, 10, 1).__str__()'2021-10-01'str(date(2021, 10, 1))'2021-10-01'
 

date.ctime()

作用:返回一个表示日期的字符串,在原生 C ctime() 函数 (time.ctime() 会发起调用该函数,但 date.ctime() 则不会) 遵循 C 标准的平台上。
from datetime import datedate(2021, 10, 1).ctime()'Fri Oct  1 00:00:00 2021'
d.ctime() 等效于 time.ctime(time.mktime(d.timetuple()))
d=date(2021, 10, 1)import timetime.ctime(time.mktime(d.timetuple()))'Fri Oct  1 00:00:00 2021'

date.strftime()

作用:翻译下就是 str from time将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串控制日期时间对象的输出格式,date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。要获取格式指令的完整列表,查看文末列表。
用法:date.strftime(format)
掌握了这个方法,随心所以的转换日期格式
import datetimedt=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)

与 date.strftime() 相同。此方法使得为 date 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能。虽然不建议使用这个装逼,但是遇到别人装逼的时候我们得知道。要获取格式指令的完整列表,请看文末附表
import datetimedt=datetime.date(2021, 10, 1)#创建一个日期对象dt.__format__("%Y年%m月%d日")'2021年10月01日'
 

4、支持的运算

date2 = date1 + timedelta
date2 等于从 date1 减去 timedelta.days 天。(1)
date2 = date1 - timedelta
计算 date2 的值使得 date2 + timedelta == date1。(2)
timedelta = date1 - date2
(3)
date1 < date2
如果 date1 的时间在 date2 之前则认为 date1 小于 date2 。(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 timeprint(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 timetime.mindatetime.time(0, 0)

time.max

最晚的可表示 time, time(23, 59, 59, 999999)。

from datetime import timetime.maxdatetime.time(23, 59, 59, 999999)

time.resolution

两个不相等的 time 对象之间可能的最小间隔,timedelta(microseconds=1),但是请注意 time 对象并不支持算术运算。

from datetime import timetime.resolutiondatetime.timedelta(microseconds=1)


3、time实例属性

time.hour

取值范围是 range(24)。

from datetime import timet = time(hour=12, minute=34, second=56, microsecond=123456)t.hour12

time.minute

取值范围是 range(60)。

t.minute34

time.second

取值范围是 range(60)。

t.second56

time.microsecond

取值范围是 range(1000000)。

t.microsecond123456

time.tzinfo

作为 tzinfo 参数被传给 time 构造器的对象,如果没有传入值则为 None。

t.tzinfo

time.fold

取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。

t.fold0

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 timet = 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 timet = 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 timet = 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 timet = 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 timet = 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, timedeltaclass 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())tdatetime.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 datetimedatetime.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 datetimedatetime.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 timeimport datetimett = time.time()tt1625542045.2471695datetime.datetime.fromtimestamp(tt)datetime.datetime(2021, 7, 6, 11, 27, 25, 247169)#取整数后,精确到秒,否则精确到微秒,一微秒=百万分之一秒datetime.datetime.fromtimestamp(1625542045)datetime.datetime(2021, 7, 6, 11, 27, 25)#例如,使用日期2008-12-27午夜UTC(自纪元起40*356*86400秒)datetime.datetime.fromtimestamp(40 * 356 * 86400)datetime.datetime(2008, 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 datetimedatetime.fromisoformat('2011-11-04')datetime.datetime(201111400)
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 datetimedatetime.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")dtdatetime.datetime(2006, 11, 21, 16, 30)

3、类属性

datetime.min

最早的可表示 datetime,datetime(MINYEAR, 1, 1, tzinfo=None)。

from datetime import datetimedatetime.mindatetime.datetime(1, 1, 1, 0, 0)

datetime.max

最晚的可表示 datetime,

datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)。from datetime import datetimedatetime.maxdatetime.datetime(9999, 12, 31, 23, 59, 59, 999999)

datetime.resolution

两个不相等的 datetime 对象之间可能的最小间隔,timedelta(microseconds=1)。

from datetime import datetimedatetime.resolutiondatetime.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 datetimedatetime(2021,5,20,13,14,0,0).month5

datetime.day

返回1到指定年月的天数间的数字。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).day20

datetime.hour

取值范围是 range(24)。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).hour13

datetime.minute

取值范围是 range(60)。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).minute14

datetime.second

取值范围是 range(60)。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).second0

datetime.microsecond

取值范围是 range(1000000)。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).microsecond0

datetime.tzinfo

作为 tzinfo 参数被传给 datetime 构造器的对象,如果没有传入值则为 None。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).fold

datetime.fold

取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。

from datetime import datetimedatetime(2021,5,20,13,14,0,0).fold0

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 datetimedatetime(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 datetimedatetime(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 datetimedatetime(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 datetimedatetime(2021, 5, 4).timestamp()1620057600.0

datetime.weekday()

作用:返回一个整数代表星期几,星期一为 0,星期天为 6。 相当于 self.date().weekday()。 另请参阅 isoweekday()。

用法:datetime.weekday()

import datetimedatetime.datetime(2021, 5, 4).weekday()1

datetime.isoweekday()

作用:返回一个整数代表星期几,星期一为 1,星期天为 7。 相当于 self.date().isoweekday()。 另请参阅 weekday(), isocalendar()。

用法:datetime.isoweekday()

import datetimedatetime.datetime(2021, 5, 4).isoweekday()2

datetime.isocalendar()

作用:返回一个由三部分组成的元组: year, week 和 weekday,哪一年、第几周和、周几等同于 self.date().isocalendar()。

用法:datetime.isocalendar()

import datetimedt = datetime.datetime.now()print(dt)2021-07-06 14:22:35.920877dt.isocalendar()(2021, 27, 2)

datetime.isoformat()

作用:返回一个以 ISO 8601 格式表示的日期和时间字符串

用法:datetime.isoformat(sep='T', timespec='auto')

from datetime import datetime, timezonedatetime(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'# strstr(datetime(2019, 5, 18, 15, 17, 8, 132263))'2019-05-18 15:17:08.132263'

datetime.ctime()

作用:返回一个表示日期和时间的字符串,输出字符串将 并不 包括时区信息,无论输入的是感知型还是简单型。

用法:datetime.ctime()

from datetime import datetimedatetime(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 datetimedt=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 对象

类型

实例方法

类方法

方法

datedatetimetime

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 datetimedt=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 timedeltadelta = timedelta(days=50,seconds=27,microseconds=10,milliseconds=29000,                  minutes=5,hours=8,weeks=2)#只有 days, seconds 和 microseconds 会存储在内部,其他会被转换deltadatetime.timedelta(days=64, seconds=29156, microseconds=10)

 

通过dir查看该类的方法和属性

import datetimedir(datetime.timedelta)['days','max','microseconds', 'min', 'resolution', 'seconds', 'total_seconds']

2、类属性

timedelta.min

The most negative timedelta object, timedelta(-999999999).

from datetime import timedeltatimedelta.mindatetime.timedelta(days=-999999999)

timedelta.max

from datetime import timedeltatimedelta.maxdatetime.timedelta(days=999999999, seconds=86399, microseconds=999999)

timedelta.resolution

两个不相等的 timedelta 类对象最小的间隔为 timedelta(microseconds=1)。

需要注意的是,因为标准化的缘故,timedelta.max > -timedelta.min,-timedelta.max 不可以表示一个 timedelta 类对象。

from datetime import timedeltatimedelta.resolutiondatetime.timedelta(microseconds=1)

 

 

3、实例属性(只读)

timedelta.days

-999999999 至 999999999 ,含999999999

from datetime import timedeltadelta = timedelta(days=50,seconds=27,microseconds=10,milliseconds=29000,                  minutes=5,hours=8,weeks=2)deltadatetime.timedelta(days=64, seconds=29156, microseconds=10)delta.days64

timedelta.seconds

0 至 86399,包含86399delta.seconds29156

timedelta.microseconds

0 至 999999,包含999999

delta.microseconds10


4、实例方法

timedelta.total_seconds()

作用:返回时间间隔包含了多少秒。等价于 td / timedelta(seconds=1)。对于其它单位可以直接使用除法的形式 (例如 td / timedelta(microseconds=1))。

需要注意的是,时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)。

from datetime import timedeltayear = 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 timedeltayear = timedelta(days=365)ten_years = 10 * yearten_yearsdatetime.timedelta(days=3650)ten_years.days // 36510nine_years = ten_years - yearnine_yearsdatetime.timedelta(days=3285)three_years = nine_years // 3three_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.MINYEAR1

datetime.MAXYEAR

date 或 datetime 对象允许最大的年份。常量 MAXYEAR 是 9999 。

import datetime datetime.MAXYEAR9999


关联阅读:Python中的时间函数strftime与strptime对比

···  END  ···

往期精彩回顾




站qq群554839127,加入微信群请扫码:
浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报