对象表示理想化日历中的date日期(年、月和日),当前的公历在两个方向上无限延伸。第 1 年的 1 月 1 日称为第 1 天,第 1 年的 1 月 2 日称为第 2 天,依此类推。这与 Dershowitz 和 Reingold 的书 Calendrical Calculations 中的“预期公历”定义相匹配,它是所有计算的基准日历。有关在预测公历和许多其他日历系统之间转换的算法,请参阅本书。

class datetime.date(yearmonthday)
所有参数都是必需的。参数必须是以下范围内的整数:

  • MINYEAR <= year <= MAXYEAR
  • 1 <= month <= 12
  • 1 <= day <= number of days in the given month and year

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

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

classmethod date.today()
返回当前的本地日期。这相当于 date.fromtimestamp(time.time()).
classmethod date.fromtimestamp(timestamp)
返回 POSIX 时间戳对应的本地日期,如time.time()OverflowError如果时间戳超出平台 Clocaltime()函数支持的值范围并且失败OSError,这可能会引发。localtime()这通常被限制在从 1970 年到 2038 年的年份。请注意,在时间戳概念中包含闰秒的非 POSIX 系统上,闰秒会被fromtimestamp().

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

classmethod date.fromordinal(ordinal)
返回对应于预测的公历序数的日期,其中第 1 年的 1 月 1 日有序数 1. ValueError除非. 对于任何日期d , .1 <= ordinal <= date.max.toordinal()date.fromordinal(d.toordinal()) == d
classmethod date.fromisoformat(date_string)
以 .发出的格式返回date对应于date_stringdate.isoformat()的。具体来说,此函数支持 format(s) 格式的字符串YYYY-MM-DD

警告

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

3.7 版中的新功能。

类属性:

date.min
最早的可表示日期.date(MINYEAR, 1, 1)
date.max
可代表的最新日期.date(MAXYEAR, 12, 31)
date.resolution
不相等的日期对象之间的最小可能差异, timedelta(days=1).

实例属性(只读):

date.year
介于MINYEARMAXYEAR包容之间。
date.month
介于 1 和 12 之间。
date.day
介于 1 和给定年份的给定月份的天数之间。

支持的操作:

操作 结果
date2 = date1 + timedelta date2timedelta.daysdate1中删除的天数。(1)
date2 = date1 - timedelta 计算date2使得. (2)date2 + timedelta == date1
timedelta = date1 - date2 (3)
date1 < date2 当 date1在时间上早于date2时, date1被认为小于date2。(4)

笔记:

  1. 如果 ,则date2及时向前移动,如果 则向后 移动。之后。 并被忽略。 如果小于 或大于 ,则引发。timedelta.days > 0timedelta.days < 0date2 - date1 == timedelta.daystimedelta.secondstimedelta.microsecondsOverflowErrordate2.yearMINYEARMAXYEAR
  2. timedelta.seconds并被timedelta.microseconds忽略。
  3. 这是准确的,不能溢出。timedelta.seconds 和 timedelta.microseconds 为 0,而 date2 + timedelta == date1 之后。
  4. 换句话说,当且仅当。如果另一个比较对象也不是对象,则会引发日期比较。但是, 如果另一个比较具有 属性,则返回。这个钩子为其他类型的日期对象提供了实现混合类型比较的机会。如果不是,则在将 对象与不同类型的对象进行比较时,将引发,除非比较是or 。后一种情况分别返回 or 。date1 < date2date1.toordinal() < date2.toordinal()TypeErrordateNotImplementedtimetuple()dateTypeError==!=FalseTrue

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

实例方法:

date.replace(year=self.yearmonth=self.monthday=self.day)
返回具有相同值的日期,除了那些由指定的关键字参数赋予新值的参数。例如,如果,那么。d == date(2002, 12, 31)d.replace(day=26) == date(2002, 12, 26)
date.timetuple()
返回一个time.struct_time如返回的time.localtime()。小时、分钟和秒为 0,DST 标志为 -1。d.timetuple() 相当于,其中是从1 月 1日开始的当年中的天数 。time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 11
date.toordinal()
返回日期的预测公历序数,其中第 1 年的 1 月 1 日的序数为 1。对于任何date对象d, .date.fromordinal(d.toordinal()) == d
date.weekday()
以整数形式返回星期几,其中星期一为 0,星期日为 6。例如,星期三。另请参阅 。date(2002, 12, 4).weekday() == 2isoweekday()
date.isoweekday()
以整数形式返回星期几,其中星期一是 1,星期日是 7。例如,星期三。另请参阅 ,。date(2002, 12, 4).isoweekday() == 3weekday()isocalendar()
date.isocalendar()
返回一个 3 元组(ISO 年、ISO 周数、ISO 工作日)。

ISO日历是公历的一种广泛使用的变体。请参阅 https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar.htm以获得很好的解释。

ISO 年由 52 或 53 个整周组成,其中一周从星期一开始,到星期日结束。ISO 年的第一周是包含星期四的一年中的第一个(公历)日历周。这称为第 1 周,该星期四的 ISO 年与其公历年相同。

例如,2004 年从星期四开始,因此 ISO 2004 年的第一周从 2003 年 12 月 29 日星期一开始,到 2004 年 1 月 4 日星期日结束,所以 和。date(2003, 12, 29).isocalendar() == (2004, 1, 1)date(2004, 1, 4).isocalendar() == (2004, 1, 7)

date.isoformat()
返回一个以 ISO 8601 格式表示日期的字符串,’YYYY-MM-DD’。例如,。date(2002, 12, 4).isoformat() == '2002-12-04'
date.__str__()
对于日期dstr(d)等价于d.isoformat()
date.ctime()
返回一个表示日期的字符串,例如. 相当于 在本机 C 函数(调用但 不调用)符合 C 标准的平台上。date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'd.ctime()time.ctime(time.mktime(d.timetuple()))ctime()time.ctime()date.ctime()
date.strftime(format)
返回一个表示日期的字符串,由显式格式字符串控制。引用小时、分钟或秒的格式代码将看到 0 值。有关格式化指令的完整列表,请参阅 strftime() 和 strptime() 行为
date.__format__(format)
与 相同date.strftime()。这使得可以date格式化字符串文字中以及在使用str.format(). 有关格式化指令的完整列表,请参阅 strftime() 和 strptime() 行为

计算事件天数的示例:

>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
...     my_birthday = my_birthday.replace(year=today.year + 1)
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202

使用示例date

>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> t = d.timetuple()
>>> for i in t:     
...     print(i)
2002                # year
3                   # month
11                  # day
0
0
0
0                   # weekday (0 = Monday)
70                  # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:    
...     print(i)
2002                # ISO year
11                  # ISO week number
1                   # ISO day number ( 1 = Monday )
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'