date 对象代表一个理想化历法中的日期(年、月和日),即当今的公历向前后两个方向无限延伸。
公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。
date构造器方法,所有参数都是必要的。 参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= 日期 <= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常。
例:
import datetime
today = datetime.date(2023,12,24) # 构造一个日期对象
yesterday = today- datetime.timedelta(days=1)
print(yesterday) # 输出:2023-12-23
返回当前的本地日期。
这等价于 date.fromtimestamp(time.time())。
例:
import datetime
print(datetime.date.today()) # 输出:2023-12-24
这个方法将一个时间戳转换为一个 date 对象。例如 time.time() 返回的就是时间戳。
例:
import datetime
import time
date = datetime.date.fromtimestamp(time.time())
print(time.time()) # 1703469443.870029
print(date) # 输出:2023-12-25
如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,可能引发 OverflowError,并且会在 localtime() 出错时引发 OSError。 请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 fromtimestamp() 所忽略。
在 3.3 版更改: 引发 OverflowError 而不是 ValueError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并会在 localtime() 出错时引发 OSError 而不是 ValueError。
这个方法将一个给定的序数(ordinal)转换为一个 date 对象。其中公元 1 年 1 月 1 日的序号为 1。
除非 1 <= ordinal <= date.max.toordinal() 否则会引发 ValueError。对于任意日期 d,date.fromordinal(d.toordinal()) == d。
3.7 新版功能.
在 3.11 版更改: 在之前版本中,此方法仅支持一种格式 YYYY-MM-DD。
例:
import datetime
date = datetime.date.fromordinal(1)
print(date) # 输出:0001-01-01,公元1年1月1日
print(datetime.date.fromordinal(738879)) # 输出:2023-12-25
返回日期的预期公历序号,其中公元 1 年 1 月 1 日的序号为 1。 对于任意 date 对象 d,date.fromordinal(d.toordinal()) == d。
例:
import datetime
date = datetime.date.toordinal(datetime.date.today())
print(date) # 输出:738879
返回一个具有同样值的日期,除非通过任何关键字参数给出了某些形参的新值。
示例:
import datetime
date = datetime.date.today() # today=2023-12-25
print(date.replace(year=1992)) # 输出:1992-12-25
返回一个整数代表星期几,星期一为1,星期天为7。例如:date(2002, 12, 4).isoweekday() == 3,表示星期三。
例:
import datetime
date = datetime.date.today()
print("今天是星期%s" %(date.isoweekday())) # 输出:今天是星期1
format 参数是一个格式化字符串,它定义了如何格式化日期。一些常见的格式化选项包括:
%Y:四位数的年份
%m:两位数的月份
%d:两位数的日期
%H:24小时制的小时数
%M:分钟数
%S:秒数
例:
from datetime import date
d = date.today()
formatted_date = d.strftime("%Y")
print(formatted_date) # 输出:2023
功能:这个方法将一个符合 ISO 8601 格式的字符串转换为 date 对象。
3.8 新版功能.
例:
from datetime import date
# 使用ISO格式字符串创建一个date对象
d = date.fromisoformat('2023-07-05')
print(d) # 输出:2023-07-05
功能:将日期对象转换为一个 time.struct_time,即 time.localtime() 所返回的类型。
hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。
d.timetuple() 等价于:
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() + 1 是当前年份中的日期序号,1 月 1 日的序号为 1。
例:
import datetime
date = datetime.date.timetuple(datetime.date.today())
print(date)
输出:time.struct_time(tm_year=2023, tm_mon=12, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=359, tm_isdst=-1)
功能:返回一个整数代表星期几,星期一为0,星期天为6。例如, date(2002, 12, 4).weekday() == 2,表示的是星期三。参阅 isoweekday()。
例:
import datetime
date = datetime.date.today()
print("今天是星期%s" %(date.weekday()+1)) # 输出:今天是星期1
功能:它返回一个三元组,包含年份、星期几和一周中的哪一天(从1(星期一)到7(星期日))。
ISO 历法是一种被广泛使用的公历。
ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。 一个 ISO 年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。 这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。
在 3.9 版更改: 结果由元组改为 named tuple。
例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日:
例:
from datetime import date
d = date.today()
year, week, weekday = d.isocalendar()
print(f"{year}年{week}周,星期{weekday}") # 输出:2023年52周,星期1
功能:返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串:
例:
from datetime import date
d = date.today()
iso_format = d.isoformat()
print(iso_format) # 输出:2023-12-25
功能:对于日期对象 d, str(d) 等价于 d.isoformat() 。
date.__str__() 是Python的 datetime.date 对象的一个特殊方法,用于返回对象的字符串表示形式。这个方法返回的字符串通常以 "YYYY-MM-DD" 的形式表示日期。
例:
from datetime import date
d = date.today()
str_format = d.__str__()
print(type(str_format))
print(str_format)
输出:
2023-12-25
功能:它将日期对象转换为一个字符串,该字符串以“Sun Jan 1 00:00:00 1970”的形式表示日期。
d.ctime() 等效于:
time.ctime(time.mktime(d.timetuple()))
例:
from datetime import date
print(date(2022,12,22).ctime()) # 输出:Thu Dec 22 00:00:00 2022
功能:用于将日期对象格式化为指定的字符串形式。
这个方法与 strftime 方法类似,但是它接受一个可选的 format 参数,用于指定日期的输出格式。
format 参数是一个字符串,它定义了日期的输出格式。
例:
from datetime import date
d = date.today()
formatted_date = d.__format__("%Y")
print(formatted_date) # 输出:2023
最小的日期 ,date(MINYEAR, 1, 1) 。
最大的日期 ,date(MAXYEAR, 12, 31)。
两个日期对象的最小间隔,timedelta(days=1)。
例:
from datetime import date
print("最小日期:%s,最大日期:%s,两日期最小间隔:%s" %(date.min,date.max,date.resolution))
输出:最小日期:0001-01-01,最大日期:9999-12-31,两日期最小间隔:1 day, 0:00:00
在 MINYEAR 和 MAXYEAR 之间,包含边界。
1 至 12(含)
返回1到指定年月的天数间的数字。
例:
import datetime
date = datetime.date.today()
print(date.year,date.month,date.day) # 输出:2023 12 25
运算 |
结果: |
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) |
注释:
1、如果 timedelta.days > 0 则 date2 将在时间线上前进,如果 timedelta.days < 0 则将后退。
操作完成后 date2 - date1 == timedelta.days。
timedelta.seconds 和 timedelta.microseconds 会被忽略。
如果 date2.year 将小于 MINYEAR 或大于 MAXYEAR 则会引发 OverflowError。
2、timedelta.seconds 和 timedelta.microseconds 会被忽略。
3、此值完全精确且不会溢出。操作完成后 timedelta.seconds 和 timedelta.microseconds 均为 0,并且 date2 + timedelta == date1。
4、换句话说,当且仅当 date1.toordinal() < date2.toordinal() 时 date1 < date2。 日期比较会引发 TypeError,如果比较目标不为 date 对象的话。 不过也可能会返回 NotImplemented,如果比较目标具有 timetuple() 属性的话。 这个钩子给予其他日期对象类型实现混合类型比较的机会。 否则,当 date 对象与不同类型的对象比较时将会引发 TypeError,除非是 == 或 != 比较。 后两种情况将分别返回 False 或 True。
from datetime import date
import time
元旦 = date(2024,1,1)
今天 = date.today()
天数 = abs(元旦 - 今天)
print(f"距离2024年元旦还有{天数.days}天") # 输出:距离2024年元旦还有7天