您的位置:  首页 » Python » datetime基本日期和时间类型的datetime对象详解(23)Python语言(必读进阶学习教程)(参考资料)

datetime对象是包含来自所有信息的单个对象date的对象和time对象。像一个date 物体一样,datetime假设当前的格里高利历在两个方向上延伸; 像时间对象一样,datetime假设每天都有3600 * 24秒。

构造函数:

class datetime.datetime小时= 0分钟= 0秒= 0微秒= 0tzinfo =无*折叠= 0 
年,月,日参数是必需的。 tzinfo可以是None,或者是tzinfo子类的实例。其余参数可以是整数,在以下范围内:

  • MINYEAR <= year <= MAXYEAR
  • 1 <= month <= 12
  • 1 <= day <= number of days in the given month and year
  • 0 <= hour < 24
  • 0 <= minute < 60
  • 0 <= second < 60
  • 0 <= microsecond < 1000000
  • fold in [0, 1]

如果给出了超出这些范围的参数,ValueError则引发。

版本3.6中的新功能:添加了fold参数。

其他构造函数,所有类方法:

classmethod datetime.today
返回当前的本地日期时间。这相当于。另见, 。tzinfoNonedatetime.fromtimestamp(time.time())now()fromtimestamp()
classmethod datetime.nowtz = None 
返回当前的本地日期和时间。如果可选参数TZNone 或没有指定,这就像today(),但是,如果可能的话,可以比从通过打算被供应得到更精确time.time()的时间戳(例如,这可以是可能的平台上提供的Cgettimeofday()函数)。

如果tz不是None,则它必须是tzinfo子类的实例,并且当前日期和时间将转换为tz的时区。在这种情况下,结果相当于tz.fromutc(datetime.utcnow().replace(tzinfo=tz))。另见today()utcnow()

classmethod datetime.utcnow
返回当前的UTC日期和时间。这就像 ,但返回当前的UTC日期和时间,作为一个天真的 对象。通过调用可以获得知道的当前UTC日期时间。另见。tzinfo Nonenow()datetimedatetime.now(timezone.utc)now()
classmethod datetime.fromtimestamptimestamptz = None 
返回与POSIX时间戳对应的本地日期和时间,例如返回的time.time()。如果可选参数TZNone或没有指定,时间戳转换为平台的本地日期和时间,返回的datetime对象是幼稚的。

如果tz不是None,则它必须是tzinfo子类的实例,并且时间戳将转换为tz的时区。在这种情况下,结果相当于tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))

fromtimestamp()OverflowError如果时间戳超出平台C localtime()gmtime()功能支持的值范围,则可能会提升,或者 OSError打开localtime()或 gmtime()失败。这种情况通常限制在1970年到2038年。请注意,在非POSIX系统中,在时间戳概念中包含闰秒,闰秒会被忽略fromtimestamp(),然后可能有两个时间戳相差一秒钟产生相同的datetime对象。另见utcfromtimestamp()

在版本3.3中更改:如果时间戳超出平台C 或函数支持的值范围,则 升高OverflowError而不是。提高 而不是开启或 失败。ValueErrorlocaltime()gmtime()OSErrorValueErrorlocaltime()gmtime()

在版本3.6中更改:fromtimestamp()可能会返回fold设置为1的实例。

classmethod datetime.utcfromtimestamptimestamp 
返回与datetimePOSIX时间戳对应 的UTC 。这可能会提高,如果时间戳是出在平台的C支持的值范围的功能,并在故障。这种情况通常限于1970年至2038年。tzinfo NoneOverflowErrorgmtime()OSErrorgmtime()

要获得有意识的datetime对象,请致电fromtimestamp()

datetime.fromtimestamp(timestamp, timezone.utc)

在POSIX兼容平台上,它等效于以下表达式:

datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)

除了后者式总是支持全范围岁:之间 MINYEARMAXYEAR包容。

在版本3.3中更改:如果时间戳超出平台C 函数支持的值范围,则 升高OverflowError而不是。提高,而不是对失败。ValueErrorgmtime()OSErrorValueErrorgmtime()

classmethod datetime.fromordinal序数
返回datetime相应的公历格里高利序数,其中第1年1月1日有序数1. ValueError除非。结果的小时,分​​钟,秒和微秒都是0,并且是。1 <= ordinal <= datetime.max.toordinal()tzinfoNone
classmethod datetime.combinedatetimetzinfo = self.tzinfo 
返回一个新datetime对象,其日期组件等于给定date对象,其时间组件等于给定time对象。如果提供了tzinfo参数,则其值用于设置tzinfo结果的tzinfo属性,否则使用time参数的属性。

对于任何datetime对象d , . 如果date是 对象,则忽略其时间组件和属性。d == datetime.combine(d.date(),d.time(), d.tzinfo)datetimetzinfo

版本3.6中已更改:添加了tzinfo参数。

classmethod datetime.fromisoformatdate_string 
以和所发出的格式之一返回datetime对应于date_string的对应项。具体来说,此函数支持格式的字符串 ,其中可以匹配任何单个字符。date.isoformat()datetime.isoformat()YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]*

警告

这不支持解析任意ISO 8601字符串 – 它仅用作反向操作datetime.isoformat()

版本3.7中的新功能。

classmethod datetime.strptimedate_stringformat 
返回datetime对应的date_string,根据格式解析 。这相当于。如果无法解析date_string和format,或者它返回的值不是时间元组,则会引发此问题。有关格式化指令的完整列表,请参阅 strftime()和strptime()行为datetime(*(time.strptime(date_string, format)[0:6]))ValueErrortime.strptime()

类属性:

datetime.min
最早的代表datetime,。datetime(MINYEAR, 1, 1, tzinfo=None)
datetime.max
最新的代表datetime,。datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
datetime.resolution
非平等datetime物体之间可能存在的最小差异, timedelta(microseconds=1)

实例属性(只读):

datetime.year
MINYEARMAXYEAR包容性。
datetime.month
介于1到12之间。
datetime.day
在给定年份的给定月份中的1和之间的天数。
datetime.hour
range(24)
datetime.minute
range(60)
datetime.second
range(60)
datetime.microsecond
range(1000000)
datetime.tzinfo
该对象作为tzinfo参数传递给datetime构造函数,或者None如果没有传递。
datetime.fold
在。用于在重复间隔期间消除墙壁时间的歧义。(当在夏令时结束时或当前区域的UTC偏移因政治原因而减少时,会发生重复间隔。)值0(1)表示两个时刻的早期(稍后)相同的墙时间表示。[0, 1]

版本3.6中的新功能。

支持的操作:

手术 结果
datetime2 = datetime1 + timedelta (1)
datetime2 = datetime1 - timedelta (2)
timedelta = datetime1 - datetime2 (3)
datetime1 < datetime2 比较datetime到 datetime。(4)
  1. datetime2是从datetime1中删除的timedelta的持续时间,如果timedelta.days> 0 则向前移动,或者如果timedelta.days<0则向后移动。结果tzinfo与输入datetime 具有相同的属性,datetime2 – datetime1 == timedelta after。OverflowError如果datetime2.year小于MINYEAR或大于, 则引发MAXYEAR。请注意,即使输入是有意识的对象,也不会进行时区调整。

  2. 计算datetime2,使datetime2 + timedelta == datetime1。至于添加,结果具有与tzinfo输入日期时间相同的属性,即使输入已知,也不会进行时区调整。

  3. 的减法datetime,从一个datetime只被定义在两个操作数是天真,或者如果两个都知道。如果一个人意识到而另一个人是天真的,那么TypeError就会被提出来。

    如果两者都幼稚,或两者都知道并具有相同的tzinfo属性,则tzinfo属性将被忽略,其结果是一个timedelta 对象使得。在这种情况下,不进行时区调整。datetime2 + t == datetime1

    如果两者都知道并具有不同的tzinfo属性,a-b行为,如果一个b被首先转化为幼稚UTC日期时间第一。结果是除了实现永远不会溢出。(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) -b.utcoffset())

  4. datetime1datetime2之前 时,datetime1被认为小于datetime2

    如果一个比较天真且另一个比较清楚,TypeError 则在尝试进行订单比较时会引发比较。对于相等比较,天真实例永远不等于意识实例。

    如果两个比较都知道并具有相同的tzinfo属性,tzinfo则忽略common 属性并比较基本日期时间。如果两个比较都知道并且具有不同的tzinfo 属性,则首先通过减去它们的UTC偏移(从中获得self.utcoffset())来调整比较。

    在版本3.3中更改:天真和感知datetime 实例之间的平等比较不会引发TypeError

    注意

    为了阻止比较回退到比较对象地址的默认方案,TypeError如果另一个比较不是对象,则日期时间比较通常会提高datetime。但是,NotImplemented如果另一个comparand具有timetuple()属性, 则返回。这个钩子为其他类型的日期对象提供了实现混合类型比较的机会。如果不是,当将datetime 对象与不同类型的对象进行TypeError比较时,除非比较为==或,否则引发该对象!=。后一种情况分别返回 FalseTrue

datetime对象可以用作字典键。在布尔上下文中,所有datetime对象都被认为是真的。

实例方法:

datetime.date
返回date同年,月,日的对象。
datetime.time
time以相同的小时,分​​钟,秒,微秒和折叠返回对象。 tzinfoNone。另见方法timetz()

在版本3.6中更改:折叠值被复制到返回的time对象。

datetime.timetz
返回time具有相同小时,分钟,秒,微秒,折叠和tzinfo属性的对象。另见方法time()

在版本3.6中更改:折叠值被复制到返回的time对象。

datetime.replaceyear = self.yearmonth = self.monthday = self.dayhour = self.hourminute = self.minutesecond = self.secondmicrosecond = self.microsecondtzinfo = self.tzinfo* fold = 0 
返回具有相同属性的日期时间,但通过指定的任何关键字参数给定新值的属性除外。请注意, tzinfo=None可以指定从感知日期时间创建天真日期时间而不转换日期和时间数据。

版本3.6中的新功能:添加了fold参数。

datetime.astimezonetz =无
返回datetime具有新tzinfo属性tz的对象,调整日期和时间数据,使得结果与self相同 ,但是在tz的本地时间。

如果提供,tz必须是tzinfo子类的实例,并且它 utcoffset()dst()方法不能返回None。如果self 是天真的,则假定它代表系统时区中的时间。

如果在不带参数(或with tz=None)的情况下调用,则假定系统使用本地时区作为目标时区。.tzinfo转换后的datetime实例的属性将设置为具有timezone 从OS获取的区域名称和偏移量的实例。

如果self.tzinfotzself.astimezone(tz)则等于self:不执行日期或时间数据的调整。否则结果是时区tz中的本地时间,表示与self相同的UTC时间:之后 ,将具有与之相同的日期和时间数据。astz =dt.astimezone(tz)astz - astz.utcoffset()dt - dt.utcoffset()

如果您只想将时区对象tz附加到日期时间dt而不调整日期和时间数据,请使用dt.replace(tzinfo=tz)。如果您只想从感知日期时间dt中删除时区对象而不转换日期和时间数据,请使用dt.replace(tzinfo=None)

请注意,tzinfo.fromutc()可以在tzinfo子类中重写默认方法 以影响返回的结果astimezone()。忽略错误情况,astimezone()行为如下:

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)

 

在版本3.3中更改:tz现在可以省略。

在版本3.6中更改:astimezone()现在可以在假定代表系统本地时间的幼稚实例上调用该方法。

datetime.utcoffset
如果tzinfoNone,则返回None,否则返回 self.tzinfo.utcoffset(self),如果后者不返回None或者timedelta幅度小于一天的对象,则引发异常。

版本3.7中已更改: UTC偏移量不限于整数分钟。

datetime.dst
如果tzinfoNone,则返回None,否则返回 self.tzinfo.dst(self),如果后者不返回None或者timedelta幅度小于一天的对象,则引发异常 。

在版本3.7中更改: DST偏移不限于整数分钟。

datetime.tzname
如果tzinfoNone,则返回None,否则返回 self.tzinfo.tzname(self),如果后者不返回None或者是字符串对象,则引发异常 ,
datetime.timetuple
返回time.struct_time如返回的time.localtime()。 d.timetuple()相当于,从1月1 日开始的当年的日期编号。结果的标志是根据方法设置的:is 或returns ,设置为; else if 返回非零值,设置为; 其他设置为。time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))yday= d.toordinal() - date(d.year, 1, 1).toordinal() + 11tm_isdstdst()tzinfoNonedst()Nonetm_isdst-1dst()tm_isdst1tm_isdst0
datetime.utctimetuple
如果datetime实例d是天真的,那么d.timetuple()除了tm_isdst被强制为0而不管d.dst()返回什么 外,这是相同的 。DST在UTC时间内从未生效。

如果d知道,则通过减去将d标准化为UTC时间 d.utcoffset(),并time.struct_time返回标准化时间的a 。tm_isdst被强制为0.请注意,OverflowError如果d。年是 MINYEAR或者MAXYEARUTC调整溢出一年边界,则可能会提高。

datetime.toordinal
返回日期的格里高利序数。同样的 self.date().toordinal()
datetime.timestamp
返回与datetime 实例对应的POSIX时间戳。返回值float与返回的值类似time.time()

datetime假设Naive 实例表示本地时间,并且此方法依赖于平台C mktime() 函数来执行转换。由于datetime支持比mktime()许多平台更广泛的值,因此这种方法可能会OverflowError在过去或将来很长时间内提高。

对于感知datetime实例,返回值计算如下:

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

版本3.3中的新功能。

在版本3.6中更改:timestamp()方法使用该fold属性消除重复间隔期间的时间歧义。

注意

没有方法直接从datetime表示UTC时间的天真实例获取POSIX时间戳。如果您的应用程序使用此约定并且您的系统时区未设置为UTC,则可以通过提供tzinfo=timezone.utc以下内容来获取POSIX时间戳 :

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
 

 

或直接计算时间戳:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

 

datetime.weekday
以星期为单位返回星期几,其中星期一为0,星期日为6 self.date().weekday()。另见isoweekday()
datetime.isoweekday
以星期为单位返回星期几,其中星期一为1,星期日为7 self.date().isoweekday()。另见weekday()isocalendar()
datetime.isocalendar
返回3元组(ISO年份,ISO周编号,ISO工作日)。同样的 self.date().isocalendar()
datetime.isoformatsep =’T’timespec =’auto’ 
以ISO 8601格式返回表示日期和时间的字符串,YYYY-MM-DDTHH:MM:SS.ffffff,如果microsecond为0,则返回YYYY-MM-DDTHH:MM:SS

如果utcoffset()不返回None,则附加一个字符串,给出UTC偏移:YYYY-MM-DDTHH:MM:SS.ffffff + HH:MM [:SS [.ffffff]]或者,如果microsecond 是0 ,则YYYY-MM-DDTHH:MM :SS + HH:MM [:SS [.ffffff]。

可选参数sep(默认值'T')是一个单字符分隔符,位于结果的日期和时间部分之间。例如,

>>> from datetime import tzinfo, timedelta, datetime 
>>> class TZ(tzinfo): 
...     def utcoffset(self, dt): return timedelta(minutes=-399) 
... 
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') 
'2002-12-25 00:00:00-06:39'

 

可选参数timespec指定要包括的时间的其他组件的数量(默认值为'auto')。它可以是以下之一:

  • 'auto':相同,'seconds'如果microsecond为0,则相同'microseconds'
  • 'hours':包括hour两位数的HH格式。
  • 'minutes':包含hourminute采用HH:MM格式。
  • 'seconds':包含hourminutesecond 以HH:MM:SS格式。
  • 'milliseconds':包括全时,但将小数秒部分截断为毫秒。HH:MM:SS.sss格式。
  • 'microseconds':包括HH:MM:SS.ffffff格式的全职时间。

注意

排除的时间组件被截断,而不是舍入。

ValueError将在无效的timespec参数上引发

>>> from datetime import datetime 
>>> datetime.now().isoformat(timespec='minutes') # doctest: +SKIP 
'2002-12-25T00:00' 
>>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) 
>>> dt.isoformat(timespec='microseconds') 
'2015-01-01T12:30:59.000000'

 

版本3.6中的新功能:添加了timespec参数。

datetime.__str__
对于datetime实例dstr(d)相当于 。d.isoformat(' ')
datetime.ctime
例如,返回表示日期和时间的字符串。相当于本机C 函数(调用但 不调用)的平台符合C标准。datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec  4 20:30:402002'd.ctime()time.ctime(time.mktime(d.timetuple()))ctime()time.ctime()datetime.ctime()
datetime.strftime格式
返回表示日期和时间的字符串,由显式格式字符串控制。有关格式化指令的完整列表,请参阅 strftime()和strptime()行为
datetime.__format__格式
与…相同datetime.strftime()。这使得可以datetime格式化的字符串文字中和使用时为对象指定格式字符串str.format()。有关格式化指令的完整列表,请参阅 strftime()和strptime()行为

使用datetime对象的示例:

>>> from datetime import datetime, date, time 
>>> # Using datetime.combine() 
>>> d = date(2005, 7, 14) 
>>> t = time(12, 30) 
>>> datetime.combine(d, t) 
datetime.datetime(2005, 7, 14, 12, 30) 
>>> # Using datetime.now() or datetime.utcnow() 
>>> datetime.now() 
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1 
>>> datetime.utcnow() 
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060) 
>>> # Using datetime.strptime() 
>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") 
>>> dt 
datetime.datetime(2006, 11, 21, 16, 30) 
>>> # Using datetime.timetuple() to get tuple of all attributes 
>>> tt = dt.timetuple() 
>>> for it in tt: 
...     print(it) 
... 
2006 # year 
11 # month 
21 # day 
16 # hour 
30 # minute 
0 # second 
1 # weekday (0 = Monday) 
325 # number of days since 1st January 
-1 # dst - method tzinfo.dst() returned None
>>> # Date in ISO format 
>>> ic = dt.isocalendar() 
>>> for it in ic: 
...     print(it) 
... 
2006 # ISO year 
47 # ISO week
2 # ISO weekday 
>>> # Formatting datetime 
>>> dt.strftime("%A, %d. %B %Y %I:%M%p") 
'Tuesday, 21. November 2006 04:30PM' 
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time") 
'The day is 21, the month is November, the time is 04:30PM.'

 

将datetime与tzinfo一起使用:

>>> from datetime import timedelta, datetime, tzinfo 
>>> class GMT1(tzinfo): 
...     def utcoffset(self, dt): 
...         return timedelta(hours=1) + self.dst(dt) 
...     def dst(self, dt): 
...         # DST starts last Sunday in March 
...         d = datetime(dt.year, 4, 1) # ends last Sunday in October 
...         self.dston = d - timedelta(days=d.weekday() + 1) 
...         d = datetime(dt.year, 11, 1) 
...         self.dstoff = d - timedelta(days=d.weekday() + 1) 
...         if self.dston <= dt.replace(tzinfo=None) < self.dstoff: 
...             return timedelta(hours=1) 
...         else: 
...             return timedelta(0) 
...     def tzname(self,dt): 
...         return "GMT +1" 
... 
>>> class GMT2(tzinfo): 
...     def utcoffset(self, dt): 
...         return timedelta(hours=2) + self.dst(dt) 
...     def dst(self, dt): 
...         d = datetime(dt.year, 4, 1) 
...         self.dston = d - timedelta(days=d.weekday() + 1) 
...         d = datetime(dt.year, 11, 1) 
...         self.dstoff = d - timedelta(days=d.weekday() + 1) 
...         if self.dston <= dt.replace(tzinfo=None) < self.dstoff: 
...             return timedelta(hours=1) 
...         else: 
...             return timedelta(0) 
...     def tzname(self,dt): 
...         return "GMT +2" 
... 
>>> gmt1 = GMT1() 
>>> # Daylight Saving Time 
>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1) 
>>> dt1.dst() 
datetime.timedelta(0) 
>>> dt1.utcoffset() 
datetime.timedelta(seconds=3600) 
>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1) 
>>> dt2.dst() 
datetime.timedelta(seconds=3600) 
>>> dt2.utcoffset() 
datetime.timedelta(seconds=7200) 
>>> # Convert datetime to another time zone 
>>> dt3 = dt2.astimezone(GMT2()) 
>>> dt3 # doctest: +ELLIPSIS 
datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>) 
>>> dt2 # doctest: +ELLIPSIS 
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>) 
>>> dt2.utctimetuple() == dt3.utctimetuple() 
True