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)
输出:
<class 'str'>
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天