一.Python datetime模塊介紹
datetime 模塊提供了可以通過多種方式操作日期和時間的類辽幌。在支持日期時間數(shù)學(xué)運算的同時,實現(xiàn)的關(guān)注點更著重于如何能夠更有效地解析其屬性用于格式化輸出和數(shù)據(jù)操作。
1.1 有效的類型
類型 | 簡介 |
---|---|
datetime.date | 一個理想化的簡單型日期样漆,它假設(shè)當(dāng)今的公歷在過去和未來永遠(yuǎn)有效晌缘。屬性year、month和day |
datetime.time | 一個理想化的時間亿鲜,它獨立于任何特定的日期允蜈,假設(shè)每天一共有 246060 秒(這里沒有”閏秒”的概念)屬性: hour, minute, second, microsecond, 和 tzinfo。 |
datetime.datetime | 日期和時間的結(jié)合。屬性:year, month, day, hour, minute, second, microsecond, and tzinfo. |
datetime.timedelta | 表示兩個 date 對象或者 time 對象,或者 datetime 對象之間的時間間隔饶套,精確到微秒漩蟆。 |
datetime.tzinfo | 一個描述時區(qū)信息的抽象基類。用于給 datetime 類和 time 類提供自定義的時間調(diào)整概念(例如妓蛮,負(fù)責(zé)時區(qū)或者夏令時)怠李。 |
datetime.timezone | 一個實現(xiàn)了 tzinfo 抽象基類的子類,用于表示相對于 世界標(biāo)準(zhǔn)時間(UTC)的偏移量蛤克。 |
子類關(guān)系:
object
timedelta
tzinfo
timezone
time
date
datetime
1.2 timedelta 類對象
timedelta 對象表示兩個 date 或者 time 的時間間隔捺癞。
class datetime.``timedelta
(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有的參數(shù)都是可選的并且默認(rèn)為 0。這些參數(shù)可以是整數(shù)或者浮點數(shù)咖耘,也可以是正數(shù)或者負(fù)數(shù)翘簇。
只有 days,seconds 和 microseconds 會存儲在內(nèi)部,即python內(nèi)部以 days,seconds 和 microseconds 三個單位作為存儲的基本單位儿倒。參數(shù)單位轉(zhuǎn)換規(guī)則如下:
1毫秒會轉(zhuǎn)換成1000微秒版保。
1分鐘會轉(zhuǎn)換成60秒。
1小時會轉(zhuǎn)換成3600秒夫否。
1星期會轉(zhuǎn)換成7天彻犁。
days, seconds, microseconds 本身也是標(biāo)準(zhǔn)化的,以保證表達(dá)方式的唯一性凰慈,例:
0 <= microseconds < 1000000
0 <= seconds < 3600*24 (一天的秒數(shù))
-999999999 <= days <= 999999999
在有任何浮點型參數(shù)或者微秒為小數(shù)的情況下汞幢,所有小數(shù)均會按照前面的換算規(guī)則疊加到下一級,并使用round-half-to-even的方法對微秒進行取舍微谓。沒有浮點型參數(shù)情況下森篷,轉(zhuǎn)換的過程就是精確的(沒有信息丟失)。
如果標(biāo)準(zhǔn)化后的 days 數(shù)值超過了指定范圍豺型,將會拋出 OverflowError異常仲智。
需要注意的是,負(fù)數(shù)被標(biāo)準(zhǔn)化后的結(jié)果會讓你大吃一驚姻氨。例如:
E:\>python
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import timedelta
>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
>>>
類屬性
timedelta.min
最大的負(fù)數(shù) ,timedelta(-999999999)
timedelta.max
最大的整數(shù), timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
timedelta.resolution
兩個相等的timedelta類對象最小的間隔為 timedelta(microseconds=1)
需要注意的是钓辆,因為標(biāo)準(zhǔn)化的緣故,timedelta.max > -timedelta.min肴焊,-timedelta.max 不可以表示一個 timedelta 類對象前联。
屬性 | 值 |
---|---|
days | -999999999 至 999999999,含999999999 |
seconds | 0至 86399 包含86399 |
microseconds | 0 至 999999,包含999999 |
支持的運算:
運算 | 結(jié)果 |
---|---|
t1 = t2 + t3 | t2 和 t3 的和娶眷。 運算后 t1-t2 == t3 and t1-t3 == t2 必為真值 |
t1 = t2 - t3 | |
t2 減 t3 的差似嗤。 運算后 t1 == t2 - t3 and t2 == t1 + t3 必為真值。 | |
t1 = t2 * i or t1 = i * t2 | 乘以一個整數(shù)届宠。運算后假如 i != 0 則 t1 // i == t2 必為真值双谆。 |
t1 = t2 * f or t1 = f * t2 | 乘以一個浮點數(shù)壳咕,結(jié)果會被舍入到 timedelta 最接近的整數(shù)倍。 精度使用四舍五偶入奇不入規(guī)則顽馋。 |
f = t2 / t3 | 返回一個浮點型的數(shù) |
t1 = t2 / f or t1 = t2 / i | 除以一個浮點數(shù)或整數(shù)。 結(jié)果會被舍入到 timedelta 最接近的整數(shù)倍幌羞。 精度使用四舍五偶入奇不入規(guī)則寸谜。 |
t1 = t2 // i or t1 = t2 // t3 | 取整除,余數(shù)部分(如果有的話)將被丟棄属桦。在第二種情況下熊痴,返回一個整數(shù)。 |
t1 = t2 % t3 | 余數(shù)為一個 timedelta 對象聂宾。 |
q, r = divmod(t1, t2) | 通過 : q = t1 // t2 (3) and r = t1 % t2 計算出商和余數(shù)果善。q是一個整數(shù),r是一個 timedelta 對象系谐。 |
+t1 | 返回一個相同數(shù)值的 timedelta 對象巾陕。 |
-t1 | 等價于 timedelta(-t1.days, -t1.seconds, -t1.microseconds), 和 t1* -1. |
abs(t) | 當(dāng) t.days >= 0時等于 +\ *t*, 當(dāng) t.days < 0 時 -t 。 |
str(t) | 返回一個形如 [D day[s], ][H]H:MM:SS[.UUUUUU] 的字符串纪他,當(dāng) t 為負(fù)數(shù)的時候鄙煤, D 也為負(fù)數(shù)。 |
repr(t) | Returns a string in the form datetime.timedelta(D[, S[, U]]), where D is negative for negative t. |
1.2.1 timedelta.total_seconds()方法
需要注意的是茶袒,時間間隔較大時梯刚,這個方法的結(jié)果中的微秒將會失真(大多數(shù)平臺上大于270年視為一個較大的時間間隔)。
>>> from datetime import timedelta
>>>
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23, minutes=50, seconds=600);
>>>
>>>
>>> year.total_seconds()
31536000.0
>>>
>>> year == another_year
True
>>>
>>> ten_years = 10 * year
>>> ten_years, ten_years.days
(datetime.timedelta(3650), 3650)
>>> nini_years = ten_years - year
>>>
>>> nine_years, nine_years.days
(datetime.timedelta(3285), 3285)
>>>
>>> three_years = nine_years // 3
>>> three_years, three_years.days
(datetime.timedelta(1095), 1095)
>>>
>>> abs(three_years - ten_years) == 2 * three_years + year
True
>>>
1.3 date對象
date 對象代表一個理想化歷法中的日期(年薪寓、月和日)亡资,即當(dāng)今的格列高利歷向前后兩個方向無限延伸。公元 1 年 1 月 1 日是第 1 日向叉,公元 1 年 1 月 2 日是第 2 日锥腻, 依此類推。 這與 Dershowitz 與 Reingold 所著 Calendrical Calculations 中“預(yù)期格列高利”歷法的定義一致植康,它是適用于該書中所有運算的基礎(chǔ)歷法旷太。 請參閱該書了解在預(yù)期格列高利歷序列與許多其他歷法系統(tǒng)之間進行轉(zhuǎn)換的算法。
class datetime.date(year, month, day)
All arguments are required. Arguments may be integers, in the following ranges:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= 日期 <= 給定年月對應(yīng)的天數(shù)
如果參數(shù)不在這些范圍內(nèi)销睁,則拋出 ValueError 異常供璧。
支持的運算:
運算 | 結(jié)果: |
---|---|
date2 = date1 + timedelta | date2等于從date1減去 timedelta.days天 |
date2 = date1 - timedelta | 計算date2的值似的date2 + timedelta == date1 |
timedelta = date1 - date2 | 精確且不會溢出 |
date1 < date2 | 如果date1的時間在date2之前則認(rèn)為date1小于date2 |
實例方法:
方法名 | 方法介紹 |
---|---|
date.replace(year=self.year, month=self.month, day=self.day) | 返回一個具有同樣值的日期,除非通過任何關(guān)鍵字參數(shù)給出了某些形參的新值冻记。 例如睡毒,如果 d == date(2002, 12, 31),則 d.replace(day=26) == date(2002, 12, 26)冗栗。 |
date.timetuple() | 返回一個 time.struct_time演顾,即與 time.localtime() 的返回類型相同供搀。 hours, minutes 和 seconds 值為 0, 且 DST 標(biāo)志值為 -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 是日期在當(dāng)前年份中的序號葛虐,起始序號 1 表示 1 月 1 日。 |
date.toordinal() | 返回日期的預(yù)期格列高利歷序號棉钧,其中公元 1 年 1 月 1 日的序號為 1屿脐。 對于任意 date 對象 d,date.fromordinal(d.toordinal()) == d宪卿。 |
date.weekday() | 返回一個整數(shù)代表星期幾的诵,星期一為0,星期天為6佑钾。例如西疤, date(2002, 12, 4).weekday() == 2,表示的是星期三休溶。 |
date.isoweekday() | 返回一個整數(shù)代表星期幾代赁,星期一為1,星期天為7邮偎。例如:date(2002, 12, 4).isoweekday() == 3,表示星期三管跺。 |
date.isocalendar() | 返回一個三元元組,(ISO year, ISO week number, ISO weekday) 禾进。 例如豁跑,2004 年的第一天是一個星期四,因此 ISO 2004 年的第一個星期開始于 2003 年 12 月 29 日星期一泻云,結(jié)束于 2004 年 1 月 4 日星期日艇拍,因此 date(2003, 12, 29).isocalendar() == (2004, 1, 1) and 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() | 對于日期對象 d, str(d) 等價于 d.isoformat() |
date.ctime() | 返回一個代表日期的字符串婆瓜,例如 date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'快集。 在原生 C ctime() 函數(shù) (time.ctime() 會發(fā)起調(diào)用該函數(shù),但 date.ctime() 則不會) 遵循 C 標(biāo)準(zhǔn)的平臺上廉白,d.ctime() 等價于 time.ctime(time.mktime(d.timetuple()))个初。 |
date.strftime(format) | 返回一個由顯式格式字符串所指明的代表日期的字符串。 表示時猴蹂、分或秒的格式代碼值將為 0院溺。 |
date.format(format) | 與 date.strftime() 相同。 此方法使得為 date 對象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 進行格式化成為可能磅轻。 要獲取格式指令的完整列表珍逸,請參閱 strftime() 和 strptime() 的行為逐虚。 |
計算距離特定事件天數(shù)的例子:
>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2021, 3, 10)
>>>
>>> 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(2021, 6, 24)
>>>
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
106
>>>
使用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 -- 年
3 -- 月
11 -- 日
0
0
0
0 -- weekday (0 = Monday)
70 -- 70th dya 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("%y%m%d")
'020311'
>>>
>>> d.strftime("%y-%m-%d")
'02-03-11'
>>> d.strftime("%Y-%m-%d")
'2002-03-11'
>>>
>>>
1.4 datetime對象
datetime 對象是一個包含了來自 date 對象和 time 對象所有信息的單一對象。 與 date 對象一樣谆膳,datetime 假定當(dāng)今的格列高利歷向前后兩個方向無限延伸叭爱;與 time 對象一樣,datetime 假定每一天恰好有 3600*24 秒漱病。
構(gòu)造器:
方法名 | 介紹 |
---|---|
class datetime.datetime | datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) |
classmethod datetime.today() | 返回當(dāng)前的本地 datetime涤伐,tzinfo 值為 None。 這等價于 datetime.fromtimestamp(time.time())缨称。 |
classmethod datetime.now(tz=None) | 返回當(dāng)前的本地 date 和 time。 如果可選參數(shù) tz 為 None 或未指定祝迂,這就類似于 today()睦尽,但該方法會在可能的情況下提供比通過 time.time() 時間戳所獲時間值更高的精度(例如,在提供了 C gettimeofday() 函數(shù)的平臺上就可能做到)型雳。 |
classmethod datetime.utcnow() | 返回當(dāng)前 UTC 日期和時間当凡,其中 tzinfo 為 None。 這類似于 now()纠俭,但返回的當(dāng)前 UTC 日期和時間是一個本機 datetime 對象沿量。 自動感知的當(dāng)前 UTC 日期時間可通過調(diào)用 datetime.now(timezone.utc) 來獲得。 |
classmethod datetime.fromtimestamp(timestamp, tz=None) | 返回對應(yīng)于 POSIX 時間戳例如 time.time() 的返回值的本地日期和時間冤荆。 如果可選參數(shù) tz 為 None 或未指定朴则,時間戳?xí)晦D(zhuǎn)換為所在平臺的本地日期和時間,返回的 datetime 對象將為天真型钓简。 |
classmethod datetime.utcfromtimestamp(timestamp) | 返回對應(yīng)于 POSIX 時間戳的 UTC datetime乌妒,其中 tzinfo 為 None。 這可能引發(fā) OverflowError外邓,如果時間戳數(shù)值超出所在平臺 C gmtime() 函數(shù)的支持范圍的話撤蚊,并會在 gmtime() 出錯時引發(fā) OSError。 通常該數(shù)值并會限制在 1970 年至 2038 年之間损话。 |
classmethod datetime.fromordinal(ordinal) | 返回對應(yīng)于預(yù)期格列高利歷序號的 datetime侦啸,其中公元 1 年 1 月 1 日的序號為 1。 除非 1 <= ordinal <= datetime.max.toordinal() 否則會引發(fā) ValueError丧枪。 結(jié)果的hour, minute, second 和 microsecond 值均為 0光涂,并且 tzinfo 值為 None。 |
classmethod datetime.combine(date, time, tzinfo=self.tzinfo) | 返回一個新的 datetime 對象豪诲,對象的日期數(shù)值等于給定的 date 對象的數(shù)值顶捷,時間數(shù)值等于給定的 time 對象的數(shù)值。 如果提供 tzinfo 參數(shù)屎篱,其值會被用來設(shè)置結(jié)果的 tzinfo 屬性服赎,否則將會使用 time 參數(shù)的 tzinfo 屬性葵蒂。 |
classmethod datetime.strptime(date_string, format) | 返回根據(jù) format 解析與 date_string 相對應(yīng)的 datetime,這等價于 datetime(*(time.strptime(date_string, format)[0:6]))重虑,如果 date_string 和 format 無法被 time.strptime() 解析或它返回一個不是時間元組的值践付,則將引發(fā) ValueError。 |
實例屬性(只讀):
如果參數(shù)不在這些范圍內(nèi)缺厉,則拋出 ValueError 異常永高。
屬性名 | 介紹 |
---|---|
datetime.year | 在 MINYEAR 和 MAXYEAR 之間,包含邊界提针。 |
datetime.month | 1 至 12(含) |
datetime.day | 返回1到指定年月的天數(shù)間的數(shù)字 |
datetime.hour | 取值范圍是 range(24) |
datetime.minute | 取值范圍是 range(60) |
datetime.second | 取值范圍是 range(60) |
datetime.microsecond | 取值范圍是 range(1000000) |
datetime.tzinfo | 作為 tzinfo 參數(shù)被傳給 datetime 構(gòu)造器的對象命爬,如果沒有傳入值則為 None。 |
datetime.fold | 取值范圍是 [0, 1]辐脖。 用于在重復(fù)的時間段中消除邊界時間歧義饲宛。 (當(dāng)夏令時結(jié)束時回調(diào)時鐘或由于政治原因?qū)е庐?dāng)前時區(qū)的 UTC 時差減少就會出現(xiàn)重復(fù)的時間段。) 取值 0 (1) 表示兩個時刻早于(晚于)所代表的同一邊界時間嗜价。 |
支持的運算:
運算 | 結(jié)果 |
---|---|
datetime2 = datetime1 + timedelta | datetime2 是從中去掉的一段 timedelta 的結(jié)果艇抠,如果 timedelta.days > 0 則是在時間線上前進,如果 timedelta.days < 0 則后退久锥。 |
datetime2 = datetime1 - timedelta | 計算 datetime2 使得 datetime2 + timedelta == datetime1家淤。 |
timedelta = datetime1 - datetime2 | 從一個 datetime 減去一個 datetime 僅對兩個操作數(shù)均為簡單型或均為感知型時有定義。 如果一個是感知型而另一個是簡單型瑟由,則會引發(fā) TypeError絮重。 |
datetime1 < datetime2 | 當(dāng) datetime1 的時間在 datetime2 之前則認(rèn)為 datetime1 小于 datetime2 |
實例方法
實例方法 | 介紹 |
---|---|
datetime.date() | 返回具有同樣 year, month 和 day 值的 date 對象。 |
datetime.time() | 返回具有同樣 hour, minute, second, microsecond 和 fold 值的 time 對象错妖。 |
datetime.timetz() | 返回具有同樣 hour, minute, second, microsecond, fold 和 tzinfo 屬性值的 time 對象绿鸣。 |
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0) | 返回一個具有同樣屬性值的 datetime,除非通過任何關(guān)鍵字參數(shù)指定了某些屬性值暂氯。 請注意可以通過指定 tzinfo=None 從一個感知型 datetime 創(chuàng)建一個簡單型 datetime 而不必轉(zhuǎn)換日期和時間值潮模。 |
datetime.astimezone(tz=None) | 返回一個具有新的 tzinfo 屬性 tz 的 datetime 對象,并會調(diào)整日期和時間數(shù)據(jù)使得結(jié)果對應(yīng)的 UTC 時間與 self 相同痴施,但為 tz 時區(qū)的本地時間擎厢。 |
datetime.utcoffset() | If tzinfo is None, returns None, else returns self.tzinfo.utcoffset(self), and raises an exception if the latter doesn’t return None, or a timedelta object representing a whole number of minutes with magnitude less than one day. |
datetime.dst() | If tzinfo is None, returns None, else returns self.tzinfo.dst(self), and raises an exception if the latter doesn’t return None, or a timedelta object representing a whole number of minutes with magnitude less than one day. |
datetime.tzname() | 如果 tzinfo 為 None,則返回 None辣吃,否則返回 self.tzinfo.tzname(self)动遭,如果后者不返回 None 或者一個字符串對象則將引發(fā)異常。 |
datetime.timetuple() | 返回一個 time.struct_time神得,即與 time.localtime() 的返回類型相同厘惦。 d.timetuple() 等價于 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() + 1 是日期在當(dāng)前年份中的序號哩簿,起始序號 1 表示 1 月 1 日宵蕉。 結(jié)果的 tm_isdst 旗標(biāo)的設(shè)定會依據(jù) dst() 方法:如果 tzinfo 為 None 或 dst() 返回 None酝静,則 tm_isdst 將設(shè)為 -1;否則如果 dst() 返回一個非零值羡玛,則 tm_isdst 將設(shè)為 1别智;否則 tm_isdst 將設(shè)為 0。 |
datetime.utctimetuple() | 如果 datetime 實例 d 為簡單型稼稿,這類似于 d.timetuple()薄榛,不同之處為 tm_isdst 會強設(shè)為 0,無論 d.dst() 返回什么結(jié)果让歼。 DST 對于 UTC 時間永遠(yuǎn)無效敞恋。 |
datetime.toordinal() | 返回日期的預(yù)期格列高利歷序號。 與 self.date().toordinal() 相同谋右。 |
datetime.timestamp() | 返回對應(yīng)于 datetime 實例的 POSIX 時間戳耳舅。 返回值是與 time.time() 類似的 float。 |
datetime.weekday() | 返回一個整數(shù)代表星期幾倚评,星期一為 0,星期天為 6馏予。 相當(dāng)于 self.date().weekday()天梧。 另請參閱 isoweekday()。 |
datetime.isoweekday() | 返回一個整數(shù)代表星期幾霞丧,星期一為 1呢岗,星期天為 7。 相當(dāng)于 self.date().isoweekday()蛹尝。 另請參閱 weekday(), isocalendar()后豫。 |
datetime.isocalendar() | 返回一個 3 元組 (ISO 年份, ISO 周序號, ISO 周日期)。 相當(dāng)于 self.date().isocalendar()突那。 |
datetime.ctime() | 返回一個代表日期和時間的字符串挫酿,例如 datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'。 在原生 C ctime() 函數(shù) (time.ctime() 會發(fā)起調(diào)用該函數(shù)愕难,但 datetime.ctime() 則不會) 遵循 C 標(biāo)準(zhǔn)的平臺上早龟,d.ctime() 等價于 time.ctime(time.mktime(d.timetuple()))。 |
datetime.strftime(format) | 返回一個由顯式格式字符串所指明的代表日期和時間的字符串猫缭, 要獲取格式指令的完整列表請參閱 strftime() 和 strptime() 的行為葱弟。 |
datetime.format(format) | 與 datetime.strftime() 相同。 此方法使得為 datetime 對象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 進行格式化成為可能猜丹。 要獲取格式指令的完整列表芝加,請參閱 strftime() 和 strptime() 的行為。 |
使用 datetime 對象的例子:
>>> from datetime import datetime, date, time
>>> d = date(2005, 7, 14)
>>> t = time(12, 30)
>>> datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> datetime.now()
datetime.datetime(2021, 3, 10, 16, 10, 53, 787000)
>>>
>>> datetime.utcnow()
datetime.datetime(2021, 3, 10, 8, 11, 6, 212000)
>>>
>>> dt = datetime.strptime("2021-03-10 16:13:00", "%Y-%m-%d %H:%M:%S")
>>> dt
datetime.datetime(2021, 3, 10, 16, 13)
>>>
>>> dt = datetime.strptime("2021-03-10 16:13:10", "%Y-%m-%d %H:%M:%S")
>>> dt
datetime.datetime(2021, 3, 10, 16, 13, 10)
>>>
>>> tt = dt.timetuple()
>>> for it in tt:
... print(it)
...
2021 -- 年
3 -- 月
10 -- 日
16 -- 小時
13 -- 分
10 -- 秒
2 -- weekday (2 = 周三)
69 -- 今年的第多少天
-1 -- 時區(qū)相關(guān)
>>>
>>> ic = dt.isocalendar()
>>> for it in ic:
... print(it)
...
2021
10
3
>>>
>>> dt.strftime("%Y-%m-%d %H:%M:%S")
'2021-03-10 16:13:10'
>>>
>>>
1.5 time 對象
一個 time 對象代表某個日期內(nèi)的(本地)時間射窒,它獨立于任何特定日期藏杖,并可通過 tzinfo 對象來調(diào)整将塑。
類屬性
類屬性 | 描述 |
---|---|
time.min | 最早的可表示 time, time(0, 0, 0, 0)。 |
time.max | 最晚的可表示 time, time(23, 59, 59, 999999)制市。 |
time.resolution | 兩個不相等的 time 對象之間可能的最小間隔抬旺,timedelta(microseconds=1),但是請注意 time 對象并不支持算術(shù)運算祥楣。 |
實例屬性(只讀)
實例屬性 | 描述 |
---|---|
time.hour | 取值范圍是 range(24)开财。 |
time.minute | 取值范圍是 range(60) |
time.second | 取值范圍是 range(60) |
time.microsecond | 取值范圍是 range(1000000) |
time.tzinfo | 作為 tzinfo 參數(shù)被傳給 time 構(gòu)造器的對象,如果沒有傳入值則為 None |
time.fold | 取值范圍是 [0, 1]误褪。 用于在重復(fù)的時間段中消除邊界時間歧義责鳍。 (當(dāng)夏令時結(jié)束時回調(diào)時鐘或由于政治原因?qū)е庐?dāng)前時區(qū)的 UTC 時差減少就會出現(xiàn)重復(fù)的時間段。) 取值 0 (1) 表示兩個時刻早于(晚于)所代表的同一邊界時間兽间。 |
支持的運算:
比較 time 和另一個 time历葛,當(dāng) a 的時間在 b 之前時,則認(rèn)為 a 小于 b嘀略。 如果比較的一方是簡單型而另一方是感知型恤溶,則如果嘗試進行順序比較將引發(fā) TypeError。 對于相等比較帜羊,簡單型實例將永遠(yuǎn)不等于感知型實例咒程。
如果兩個比較方都是感知型,且具有相同的 tzinfo 屬性帐姻,相同的 tzinfo 屬性會被忽略并對基本時間值進行比較。 如果兩個比較方都是感知型且具有不同的 tzinfo 屬性呢铆,兩個比較方將首先通過減去它們的 UTC 差值(使用 self.utcoffset() 獲却倘鳌)來進行調(diào)整逆航。 為了防止將混合類型比較回退為基于對象地址的默認(rèn)比較,當(dāng) time 對象與不同類型的對象比較時抹剩,將會引發(fā) TypeError澳眷,除非比較運算符是 == 或 !=衷敌。 在后一種情況下將分別返回 False 或 True缴罗。
哈希面氓,以便用作字典的鍵
高效的封存
在布爾運算時,time 對象總是被視為真值禀横。
實例方法
實例方法 | 描述 |
---|---|
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0) | 返回一個具有同樣屬性值的 time,除非通過任何關(guān)鍵字參數(shù)指定了某些屬性值复亏。 |
time.isoformat(timespec='auto') | Return a string representing the time in ISO 8601 format, HH:MM:SS.mmmmmm or, if microsecond is 0, HH:MM:SS If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: HH:MM:SS.mmmmmm+HH:MM or, if self.microsecond is 0, HH:MM:SS+HH:MM |
time.str() | 對于時間對象 t, str(t) 等價于 t.isoformat()。 |
time.strftime(format) | 返回一個由顯式格式字符串所指明的代表時間的字符串耕突。 要獲取格式指令的完整列表請參閱 strftime() 和 strptime() 的行為。 |
time.format(format) | 與 time.strftime() 相同上祈。 此方法使得為 time 對象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 進行格式化成為可能登刺。 要獲取格式指令的完整列表皇耗,請參閱 strftime() 和 strptime() 的行為损合。 |
time.utcoffset() | If tzinfo is None, returns None, else returns self.tzinfo.utcoffset(None), and raises an exception if the latter doesn’t return None or a timedelta object representing a whole number of minutes with magnitude less than one day. |
time.dst() | If tzinfo is None, returns None, else returns self.tzinfo.dst(None), and raises an exception if the latter doesn’t return None, or a timedelta object representing a whole number of minutes with magnitude less than one day. |
time.tzname() | 如果 tzinfo 為 None,則返回 None傅寡,否則返回 self.tzinfo.tzname(None)荐操,如果后者不返回 None 或者一個字符串對象則將引發(fā)異常。 |
>>> from datetime import time, tzinfo, timedelta
>>> class GMT1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self, dt):
... return "Europe/Prague"
...
>>>
>>> t = time(12, 10, 30, tzinfo=GMT1())
>>> t
datetime.time(12, 10, 30, tzinfo=<__main__.GMT1 object at 0x0000000002882978>)
>>> gmt = gmt1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'gmt1' is not defined
>>> gmt = GMT1()
>>>
>>> t.isoformat()
'12:10:30+01:00'
>>>
>>> t.dst()
datetime.timedelta(0)
>>>
>>> t.tzname()
'Europe/Prague'
>>>
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 Europe/Prague'
>>>
>>>
1.6 tzinfo 對象
一個描述時區(qū)信息的抽象基類。用于給 datetime 類和 time 類提供自定義的時間調(diào)整概念(例如疗绣,負(fù)責(zé)時區(qū)或者夏令時)多矮。
與時區(qū)相關(guān),此處省略。
1.7 timezone 對象
一個實現(xiàn)了 tzinfo 抽象基類的子類立轧,用于表示相對于 世界標(biāo)準(zhǔn)時間(UTC)的偏移量匀借。
與時區(qū)相關(guān)凳怨,此處省略。
二.datetime模塊實操
2.1 datetime模塊常用方法案例
代碼:
from datetime import datetime, date, time, timedelta
# 獲取當(dāng)前日期及時間
datetime_object = datetime.now()
print(datetime_object)
# 獲取當(dāng)前日期
datetime_object = date.today()
print(datetime_object)
# 打印今天的年李剖,月和日
today = date.today()
print("當(dāng)前年:",today.year)
print("當(dāng)前月:",today.month)
print("當(dāng)前日:",today.day)
# 打印 時分秒及微妙
t = time(17, 8, 21,1)
print("小時=", t.hour)
print("分鐘=", t.minute)
print("秒=", t.second)
print("微秒=", t.microsecond)
# datetime類使用實例,并打印 年,月德玫,時宰僧,分,秒及時間戳
a = datetime(2021, 3, 10)
print(a)
b = datetime(2021, 3, 10, 17, 12, 23, 22222)
print(b)
print("年 =", b.year)
print("月 =", b.month)
print("日 =", b.day)
print("時 =", b.hour)
print("分 =", b.minute)
print("秒 =", b.second)
print("微妙 =", b.microsecond)
print("時間戳 =", a.timestamp())
# timedelta 對象表示兩個日期或時間之間的時差
t1 = date(2021, 3, 10)
t2 = date(2001, 1, 1)
t3 = t1 - t2
print("t3 = ", t3)
t4 = datetime(2021, 3, 10, 17, 12, 23, 22222)
t5 = datetime(2000, 1, 1, 0, 0, 0, 0)
t6 = t4 - t5
print("t6 = ",t6)
print("type of t3 =",type(t3))
print("type of t6 =",type(t6))
# 兩個timedelta對象之間的時間差
t1 = timedelta(weeks = 2, days = 5, hours = 1, seconds = 33)
t2 = timedelta(days = 4, hours = 11, minutes = 4, seconds = 54)
t3 = t1 - t2
print("t3 =", t3)
測試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/datetime_test1.py
2021-03-10 17:23:49.158000
2021-03-10
當(dāng)前年: 2021
當(dāng)前月: 3
當(dāng)前日: 10
小時= 17
分鐘= 8
秒= 21
微秒= 1
2021-03-10 00:00:00
2021-03-10 17:12:23.022222
年 = 2021
月 = 3
日 = 10
時 = 17
分 = 12
秒 = 23
微妙 = 22222
時間戳 = 1615305600.0
t3 = 7373 days, 0:00:00
t6 = 7739 days, 17:12:23.022222
type of t3 = <class 'datetime.timedelta'>
type of t6 = <class 'datetime.timedelta'>
t3 = 14 days, 13:55:39
Process finished with exit code 0
2.2 格式日期時間
日期和時間的表示方式在不同的地方,組織等中可能有所不同佃延。在美國仔沿,使用mm / dd / yyyy更為常見,而在英國使用dd / mm / yyyy更為常見碾局。
Python有strftime()和strptime()方法來處理這個問題。
Python strftime()-字符串的日期時間對象
strftime()方法是在date像啼、datetime和time類下面定義的忽冻。該方法根據(jù)給定的日期、日期時間或時間對象創(chuàng)建格式化的字符串秀菱。
本文以datetime舉例說明振诬,time里也是一樣的
2.2.1 使用strftime()格式化日期
指令 | 含義 | 示例 | |||
---|---|---|---|---|---|
%a | 當(dāng)?shù)毓ぷ魅盏目s寫。 | Sun, Mon, …, Sat (美國);So, Mo, …, Sa (德國) | |||
%A | 當(dāng)?shù)毓ぷ魅盏娜?/td> | Sunday, Monday, …, Saturday (美國);Sonntag, Montag, …, Samstag (德國) | |||
%w | 以十進制數(shù)顯示的工作日衍菱,其中0表示星期日赶么,6表示星期六。 | 0, 1, …, 6 | |||
%d | 補零后脊串,以十進制數(shù)顯示的月份中的一天辫呻。 | 01, 02, …, 31 | |||
%b | 當(dāng)?shù)卦路莸目s寫。 | Jan, Feb, …, Dec (美國);Jan, Feb, …, Dez (德國) | |||
%B | 當(dāng)?shù)卦路莸娜?/td> | January, February, …, December (美國);Januar, Februar, …, Dezember (德國) | |||
%m | 補零后,以十進制數(shù)顯示的月份谜叹。 | 01, 02, …, 12 | |||
%y | 補零后猜年,以十進制數(shù)表示的,不帶世紀(jì)的年份。 | 00, 01, …, 99 | |||
%Y | 十進制數(shù)表示的帶世紀(jì)的年份锹杈。 | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | |||
%H | 以補零后的十進制數(shù)表示的小時(24 小時制)奴潘。 | 00, 01, …, 23 | |||
%I | 以補零后的十進制數(shù)表示的小時(12 小時制)。 | 01, 02, …, 12 | |||
%p | 本地化的 AM 或 PM 扫腺。 | AM, PM (美國);am, pm (德國) | |||
%M | 補零后躁劣,以十進制數(shù)顯示的分鐘蒋荚。 | 00, 01, …, 59 | |||
%S | 補零后吼渡,以十進制數(shù)顯示的秒耿戚。 | 00, 01, …, 59 | |||
%f | 以十進制數(shù)表示的微秒命黔,在左側(cè)補零。 | 000000, 000001, …, 999999 | |||
%z | UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). | (empty), +0000, -0400, +1030 | |||
%Z | 時區(qū)名稱(如果對象為簡單型則為空字符串)。 | (空), UTC, EST, CST | |||
%j | 以補零后的十進制數(shù)表示的一年中的日序號胳赌。 | 001, 002, …, 366 | |||
%U | 以補零后的十進制數(shù)表示的一年中的周序號(星期日作為每周的第一天)捍掺。 在新的一年中第一個星期日之前的所有日子都被視為是在第 0 周挺勿。 | 00, 01, …, 53 | |||
%W | 以十進制數(shù)表示的一年中的周序號(星期一作為每周的第一天)。 在新的一年中第一個第期一之前的所有日子都被視為是在第 0 周。 | 00, 01, …, 53 | |||
%c | 本地化的適當(dāng)日期和時間表示神僵。 | Tue Aug 16 21:30:00 1988 (美國);Di 16 Aug 21:30:00 1988 (德國) | |||
%x | 本地化的適當(dāng)日期表示胁赢。 | 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE) | |||
%X | 本地化的適當(dāng)時間表示企蹭。 | 21:30:00 (en_US);21:30:00 (de_DE) | |||
%% | 字面的 '%' 字符。 | % |
代碼:
from datetime import datetime
now = datetime.now()
t = now.strftime("%Y-%m-%d %H:%M:%S")
print(t)
測試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/dattime_test2.py
2021-03-10 17:28:15
Process finished with exit code 0
2.2.2 Python strptime()-日期時間的字符串
代碼:
from datetime import datetime
date_string = "1 October, 2020"
print("date_string =", date_string)
date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)
測試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/datetime_test3.py
date_string = 1 October, 2020
date_object = 2020-10-01 00:00:00
Process finished with exit code 0
2.3 python 時間戳
代碼:
from datetime import datetime
# 時間戳轉(zhuǎn)為時間
timestamp = 1545730073
dt_object = datetime.fromtimestamp(timestamp)
print("dt_object =", dt_object)
print("type(dt_object) =", type(dt_object))
# 時間轉(zhuǎn)為時間戳
dt = '2018-12-25 17:27:53'
dt2 = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
dt_timestamp = datetime.timestamp(dt2)
print("dt_timestamp =", dt_timestamp)
print("type(dt_timestamp) =", type(dt_timestamp))
測試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/datetime_test4.py
dt_object = 2018-12-25 17:27:53
type(dt_object) = <class 'datetime.datetime'>
dt_timestamp = 1545730073.0
type(dt_timestamp) = <class 'float'>
Process finished with exit code 0
三.time模塊簡介
Python time.time()
time()函數(shù)返回自紀(jì)元以來經(jīng)過的秒數(shù)智末。
這個地方用得比較多的是Python time.sleep()
sleep()函數(shù)在給定的秒數(shù)內(nèi)暫停(延遲)當(dāng)前線程的執(zhí)行谅摄。
代碼:
import time
import datetime
print("這是立即打印輸出。",datetime.datetime.now())
time.sleep(4)
print("這是4秒后打印的系馆。",datetime.datetime.now())
測試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/time_test1.py
這是立即打印輸出送漠。 2021-03-10 18:16:38.225000
這是4秒后打印的。 2021-03-10 18:16:42.225000
Process finished with exit code 0
參考:
1.https://docs.python.org/zh-cn/3.6/library/datetime.html
2.https://blog.csdn.net/kobeyu652453/article/details/108894807