Python常用模塊4-Python的datetime及time模塊簡介

一.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) 表示兩個時刻早于(晚于)所代表的同一邊界時間兽间。

支持的運算:

  1. 比較 time 和另一個 time历葛,當(dāng) a 的時間在 b 之前時,則認(rèn)為 a 小于 b嘀略。 如果比較的一方是簡單型而另一方是感知型恤溶,則如果嘗試進行順序比較將引發(fā) TypeError。 對于相等比較帜羊,簡單型實例將永遠(yuǎn)不等于感知型實例咒程。

  2. 如果兩個比較方都是感知型,且具有相同的 tzinfo 屬性帐姻,相同的 tzinfo 屬性會被忽略并對基本時間值進行比較。 如果兩個比較方都是感知型且具有不同的 tzinfo 屬性呢铆,兩個比較方將首先通過減去它們的 UTC 差值(使用 self.utcoffset() 獲却倘鳌)來進行調(diào)整逆航。 為了防止將混合類型比較回退為基于對象地址的默認(rèn)比較,當(dāng) time 對象與不同類型的對象比較時抹剩,將會引發(fā) TypeError澳眷,除非比較運算符是 == 或 !=衷敌。 在后一種情況下將分別返回 False 或 True缴罗。

  3. 哈希面氓,以便用作字典的鍵

  4. 高效的封存

在布爾運算時,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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末由蘑,一起剝皮案震驚了整個濱河市螺男,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纵穿,老刑警劉巖下隧,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谓媒,居然都是意外死亡淆院,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來土辩,“玉大人支救,你說我怎么就攤上這事】教裕” “怎么了各墨?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長启涯。 經(jīng)常有香客問我贬堵,道長,這世上最難降的妖魔是什么结洼? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任黎做,我火速辦了婚禮,結(jié)果婚禮上松忍,老公的妹妹穿的比我還像新娘蒸殿。我一直安慰自己,他們只是感情好鸣峭,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布宏所。 她就那樣靜靜地躺著,像睡著了一般摊溶。 火紅的嫁衣襯著肌膚如雪楣铁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天更扁,我揣著相機與錄音盖腕,去河邊找鬼。 笑死浓镜,一個胖子當(dāng)著我的面吹牛溃列,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膛薛,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼听隐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哄啄?” 一聲冷哼從身側(cè)響起雅任,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咨跌,沒想到半個月后沪么,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锌半,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年禽车,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡殉摔,死狀恐怖州胳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逸月,我是刑警寧澤栓撞,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站碗硬,受9級特大地震影響瓤湘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肛响,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惜索。 院中可真熱鬧特笋,春花似錦、人聲如沸巾兆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽角塑。三九已至蔫磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圃伶,已是汗流浹背堤如。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窒朋,地道東北人搀罢。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像侥猩,于是被迫代替她去往敵國和親榔至。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容