import datetime
datetime.datetime.now()
datetime.datetime(2025, 4, 15, 7, 56, 33, 132891)
dt = datetime.datetime(2015, 10, 21, 16, 29, 0)
dt.year, dt.month, dt.day
(2015, 10, 21)
dt.hour, dt.minute, dt.second
(16, 29, 0)
调用 datetime.datetime.now()
返回一个datetime
对象,
表示当前的日期和时间,根据计算机的时钟。这个对象包含当前时刻的年、月、日、时、分、秒和微秒。
也可以利用 datetime.datetime()
函数,
向它传入代表年、月、日、时、分、秒的整数,
得到特定时刻的 datetime
对象。
这些整数将保存在 datetime
对象的 year
、month
、 day
、 hour
、minute
和second
属性中。
Unix纪元时间戳可以通过 datetime.datetime.fromtimestamp()
,
转换为 datetime
对象。 datetime
对象的日期和时间将根据本地时区转换。
在交互式环境中输入以下代码:
datetime.datetime.fromtimestamp(100000)
datetime.datetime(1970, 1, 2, 3, 46, 40)
import time
datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2025, 4, 15, 7, 56, 33, 151476)
调用datetime.datetime.fromtimestamp()
并传入1000000,
返回一个datetime
对象,表示Unix
纪元后1000000秒的时刻。
传入time.time()
,即当前时刻的Unix纪元时间戳,则返回当前时刻的datetime
对象。
因此,表达式 datetime.datetime.now()
和datetime.datetime.fromtimestamp(time.time())
做的事情相同,
它们都返回当前时刻的datetime
对象。
注意:这些例子是在一台设置了太平洋标准时间的计算机上输入的。 如果在另一个时区,结果会有所不同。
datetime
对象可以用比较操作符进行比较,弄清楚谁在前面。
后面的 datetime
对象是“更大”的值。在交互式环境中输入以下代码:
halloween2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
newyears2016 = datetime.datetime(2016, 1, 1, 0, 0, 0)
oct31_2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
halloween2015 == oct31_2015
True
halloween2015 > newyears2016
False
newyears2016 > halloween2015
True
newyears2016 != oct31_2015
True
为2015年10月31日的第一个时刻(午夜)创建一个datetime
对象,
将它保存在 halloween2015
中。
为2016年1月1日的第一个时刻创建一个 datetime
对象,
将它保存在 newyears2016
中。然后,为2015年10月31日的午夜创建另一个对象,
将它保存在oct31_2015
中。
比较 halloween2015
和 oct31_2015
,它们是相等的。
比较 newyears2016
和 halloween2015
,
newyears2016
大于(晚于)halloween2015
。
timedelta
数据类型
datetime
模块还提供了timedelta
数据类型,
它表示一段时间,而不是一个时刻。
在交互式环境中输入以下代码:
delta = datetime.timedelta(days=11, hours=10, minutes=9,seconds=8)
delta.days, delta.seconds, delta.microseconds
(11, 36548, 0)
delta.total_seconds()
986948.0
str(delta)
'11 days, 10:09:08'
要创建 timedelta
对象,就用datetime.timedelta()
函数。
datetime.timedelta()
函数接受关键字参数weeks
、
days
、hours
、minutes
、seconds、milliseconds
和 microseconds
。没有 month
和 year
关键字参数,
因为“月”和“年”是可变的时间,依赖于特定月份或年份。
timedelta
对象拥有的总时间以天、秒、微秒来表示。
这些数字分别保存在days
、seconds
和 microseconds
属性中。
total_seconds
()方法返回只以秒表示的时间。
将一个timedelta
对象传入str()
,
将返回格式良好的、人类可读的字符串表示。
在这个例子中,将关键字参数传入 datetime.delta()
,
指定11天、10小时、9分和8秒的时间,将返回的 timedelta
对象保存在 delta
中 。
该 timedelta
对象的days
属性为11,
seconds
属性为36548(10小时、9分钟、8秒,以秒表示)。
调用 total_seconds()
说明,11天、10小时、9分和8秒是986948秒。
最后,将这个timedelta
对象传入 str()
,返回一个字符串,明确解释了这段时间。
算术运算符可以用于对 datetime
值进行日期运算。例如,
要计算今天之后1000天的日期,在交互式环境中输入以下代码:
dt = datetime.datetime.now()
dt
datetime.datetime(2025, 4, 15, 7, 56, 33, 232587)
thousandDays = datetime.timedelta(days=1000)
dt + thousandDays
datetime.datetime(2028, 1, 10, 7, 56, 33, 232587)
首先,生成表示当前时刻的 datetime
对象,保存在 dt
中。
然后生成一个 timedelta
对象,表示1000天,保存在thousandDays
中。
dt
与 thousandDays
相加,
得到一个 datetime
对象,表示现在之后的1000天。
Python将完成日期运算,弄清楚2015年2月27日之后的1000天,
将是2017年11月23日。这很有用,因为如果要从一个给定的日期计算1000天之后,
需要记住每个月有多少天,闰年的因素和其他棘手的细节。
datetime
模块可处理所有这些问题。
利用+
和-
运算符,
timedelta
对象与 datetime
对象或其他 timedelta
对象相加或相减。
利用 *
和/
运算符, timedelta
对象可以乘以或除以整数或浮点数。
在交互式环境中输入以下代码:
oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)
aboutThirtyYears = datetime.timedelta(days=365 * 30)
oct21st
datetime.datetime(2015, 10, 21, 16, 29)
oct21st - aboutThirtyYears
datetime.datetime(1985, 10, 28, 16, 29)
oct21st - (2 * aboutThirtyYears)
datetime.datetime(1955, 11, 5, 16, 29)
这里生成了一个 DateTime
对象,表示2015年10月21日,
以及一个timedelta
对象,表示大约30年的时间(假设每年为365天)。
从 oct21st
中减去 aboutThirtyYears
,
就得到一个 datetime
对象,表示2015年10月21日前30年的一天。
从 oct21st
中减去2 * aboutThirtyYears
,
得到一个 datetime
对象,表示2015年10月21日之前60年的一天。
暂停直至特定日期
time.sleep()
方法可以暂停程序若干秒。利用一个while
循环,
可以让程序暂停,直到一个特定的日期。
例如,下面的代码会继续循环,直到2016年万圣节:
import datetime
import time
halloween2016 = datetime.datetime(2016, 10, 31, 0, 0, 0)
while datetime.datetime.now() < halloween2016:
time.sleep(1)
time.sleep(1)
调用将暂停 Python
程序,
这样计算机不会浪费CPU处理周期,
一遍又一遍地检查时间。相反, while
循环只是每秒检查一次,
在2016年万圣节(或编程让它停止的时间)后继续执行后面的程序。
datetime
对象转换为字符串
Unix纪元时间戳和 datetime
对象对人类来说都不是很友好可读。
利用 strftime()
方法,可以将 datetime
对象显示为字符串。
( strftime()
函数名中的f
表示格式, format
)。
strftime()
方法使用的指令类似于Python
的字符串格式化。
下表列出了完整的 strftime()
指令。
strftime 指令 |
含义 |
---|---|
%Y |
带世纪的年份,例如'2014’ |
%y |
不带世纪的年份,'00'至'99' (1970至2069) |
%m |
数字表示的月份,'01'至'12’ |
%B |
完整的月份,例如'November' |
%b |
简写的月份,例如'Nov' |
%d |
一月中的第几天,’01’至31' |
%j |
—年中的第几天,’001'至'366’ |
%w |
一周中的第几天,'0'(周日)至'6’(周六) |
%A |
完整的周几,例如'Monday' |
%a |
简写的周几,例如'Mon' |
%H |
小时(24小时时钟),'00'至23' |
%I |
小时(12小时时钟),'01'至'12’ |
%M |
分,'00’至'59' |
%S |
秒,'00'至'59' |
%p |
'AM'或'PM' |
%% |
就是'%’字符 |
向strftime()
传入一个定制的格式字符串,其中包含格式化指定(以及任何需要的斜线、冒号等),
strftime()
将返回一个格式化的字符串,
表示datetime
对象的信息。
在交互式环境中输入以下代码:
oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)
oct21st.strftime('%Y/%m/%d %H:%M:%S')
'2015/10/21 16:29:00'
oct21st.strftime('%I:%M %p')
'04:29 PM'
oct21st.strftime("%B of '%y")
"October of '15"
这里有一个 datetime
对象,表示2015年10月21日下午4点29分,
保存在 oct21st
中。向 strftime()
传入定制的格式字符串'%Y/%m/%d %H:%M:%S'
,
返回一个字符串,包含以斜杠分隔的2015、10和21,
以冒号分隔的16、29和00。传入'%I:%M %p'
则返回'04:29 PM'
,
传入"%B of '%y"
则返回 "October of '15"
。
请注意,strftime()
不是以 datetime.datetime
开始。
在交互式环境中输入以下代码:
datetime.datetime.strptime('October 21, 2015', '%B %d, %Y')
datetime.datetime(2015, 10, 21, 0, 0)
datetime.datetime.strptime('2015/10/21 16:29:00','%Y/%m/%d %H:%M:%S')
datetime.datetime(2015, 10, 21, 16, 29)
datetime.datetime.strptime("October of '15", "%B of '%y")
datetime.datetime(2015, 10, 1, 0, 0)
datetime.datetime.strptime("November of '63", "%B of '%y")
datetime.datetime(2063, 11, 1, 0, 0)
要从字符串 'October 21,2015'
艰得一个 datetime
对象,
将 'October21, 2015'
作为第一个参数传递给 strptime()
,
并将对应于’October 21,2015'
的定制格式字符串作为第二个参数。
带有日期信息的字符串必须准确匹配定制的格式字符串,
否则 Python将抛出 ValueError
异常。