Python表示當(dāng)前時(shí)間的方法合集
在 Python 中獲取當(dāng)前時(shí)間是許多與時(shí)間有關(guān)的操作的一個(gè)很好的起點(diǎn)。一個(gè)非常重要的用例是創(chuàng)建時(shí)間戳。在本教程中,你將學(xué)習(xí)如何用 datetime 模塊獲取、顯示和格式化當(dāng)前時(shí)間。
我們將學(xué)習(xí)如何讀取當(dāng)前時(shí)間的屬性,如年份、分鐘或秒。為了使時(shí)間更容易閱讀,將探索打印時(shí)間的選項(xiàng)。我們還將了解不同的時(shí)間格式,學(xué)習(xí)計(jì)算機(jī)如何表示時(shí)間,如何將時(shí)間序列化,以及如何處理時(shí)區(qū)問(wèn)題。
如何在Python中獲取時(shí)間
獲取和打印當(dāng)前時(shí)間最直接的方法是使用 datetime 模塊中 datetime 類(lèi)的 .now()方法。
>>> from datetime import datetime >>> now = datetime.now() >>> now datetime(2022, 11, 22, 14, 31, 59, 331225) >>> print(now) 2022-11-22 14:31:59.331225
類(lèi)方法 .now()是一個(gè)構(gòu)造方法,返回一個(gè)日期時(shí)間對(duì)象。當(dāng)REPL評(píng)估now變量時(shí),你會(huì)得到一個(gè)日期時(shí)間對(duì)象的表示。要知道每個(gè)數(shù)字的含義可能相當(dāng)困難。但是如果明確地打印now變量,那么你會(huì)得到一個(gè)稍微不同的輸出,它以熟悉的時(shí)間戳格式呈現(xiàn)信息。
你可能會(huì)認(rèn)識(shí)到打印的datetime對(duì)象的格式。它嚴(yán)格遵循國(guó)際標(biāo)準(zhǔn),即ISO 8601,用于格式化時(shí)間和日期。你會(huì)在很多地方發(fā)現(xiàn)這種格式!
不過(guò),在 Python 使用的格式中,與 ISO 8601 標(biāo)準(zhǔn)有一點(diǎn)偏差。標(biāo)準(zhǔn)規(guī)定,時(shí)間戳的日期和小時(shí)部分應(yīng)該用T字符分開(kāi),但是通過(guò) print()函數(shù)傳遞的默認(rèn)日期對(duì)象用一個(gè)空格將它們分開(kāi)。
Python 是可擴(kuò)展的和可定制的,它使你能夠定制打印時(shí)間戳的格式。在打印時(shí),datetime類(lèi)內(nèi)部使用它的 .isoformat()方法。由于 .isoformat()只是一個(gè)實(shí)例方法,你可以從任何日期時(shí)間對(duì)象中直接調(diào)用它來(lái)定制ISO時(shí)間戳。
>>> datetime.now().isoformat() '2022-11-22T14:31:59.331225' >>> datetime.now().isoformat(sep=" ") '2022-11-22 14:31:59.331225'
你會(huì)注意到,當(dāng)你調(diào)用 .isoformat()時(shí),沒(méi)有任何參數(shù),使用的是標(biāo)準(zhǔn)的ISO 8601分隔符T。然而,datetime類(lèi)實(shí)現(xiàn)其特殊實(shí)例方法 .__str__()的方式,是用一個(gè)空格作為分隔符參數(shù)。
能夠得到完整的日期和時(shí)間是很好的,但有時(shí)你可能會(huì)尋找一些特定的東西。例如,你可能只想知道月份或日期。在這些情況下,你可以從一系列的屬性中選擇。
>>> from datetime import datetime >>> now = datetime.now() >>> print(f""" ... {now.month = } ... {now.day = } ... {now.hour = } ... {now.minute = } ... {now.weekday() = } ... {now.isoweekday() = }""" ... ) now.month = 11 now.day = 22 now.hour = 14 now.minute = 31 now.weekday() = 1 now.isoweekday() = 2
在這個(gè)片段中,使用了一個(gè)三引號(hào)的f-字符串,在大括號(hào)內(nèi)使用=符號(hào)來(lái)輸出表達(dá)式和其結(jié)果。
繼續(xù)探索不同的屬性和方法,用一個(gè)datetime對(duì)象調(diào)用 dir()函數(shù),列出當(dāng)前范圍內(nèi)可用的名稱(chēng)?;蛘吣憧梢圆榭匆幌耫atetime的文檔。無(wú)論哪種方式,你都會(huì)發(fā)現(xiàn)有大量的選項(xiàng)。
你會(huì)注意到,最后一個(gè)例子的結(jié)果一般都是數(shù)字。這可能很適合你,但也許將工作日顯示為數(shù)字并不理想。由于 .weekday()和 .isoweekday()方法返回不同的數(shù)字,這也會(huì)讓人特別困惑。
一個(gè)ISO時(shí)間戳很好,但也許你想要比ISO時(shí)間戳更可讀的東西。例如,對(duì)于一個(gè)人來(lái)說(shuō),毫秒可能有點(diǎn)難讀。在下一節(jié)中,你將學(xué)習(xí)如何以任何你喜歡的方式格式化你的時(shí)間戳。
格式化時(shí)間戳以提高可讀性
為了方便以自定義的、人類(lèi)可讀的方式輸出時(shí)間,datetime有一個(gè)方法叫做 .strftime()。.strftime()方法需要一個(gè)格式代碼作為參數(shù)。格式代碼是一個(gè)包含一堆特殊標(biāo)記的字符串,這些標(biāo)記將被替換成來(lái)自datetime對(duì)象的信息。
.strftime()方法將為你提供大量的選項(xiàng),以確定如何準(zhǔn)確地表示你的日期時(shí)間對(duì)象。例如,以下面這種格式為例。
>>> from datetime import datetime >>> datetime.now().strftime("%A, %B %d") 'Tuesday, November 22'
在這個(gè)例子中,使用了以下格式代碼:
- %A : 星期的全稱(chēng)
- %B : 月的全稱(chēng)
- %d : 本月的數(shù)字日期
格式字符串中的逗號(hào)和字面空格按原樣打印。.strftime()方法只替換它所識(shí)別的代碼。.strftime()中的格式代碼總是以百分號(hào)(%)開(kāi)始,這遵循了一個(gè)舊的C標(biāo)準(zhǔn)。這些代碼類(lèi)似于舊的printf字符串格式化風(fēng)格,但它們是不一樣的。
格式代碼的文檔中有一個(gè)很好的表格,向你展示了可以使用的所有不同的格式代碼。
>>> f"{datetime.now():%A, %B %d}" 'Tuesday, November 22'
因此,現(xiàn)在你可以獲得時(shí)間并按照你的喜好進(jìn)行格式化。這應(yīng)該可以滿(mǎn)足你的基本時(shí)間顯示需求,但也許你對(duì)計(jì)算機(jī)如何在內(nèi)部表示和處理時(shí)間以及如何在文件或數(shù)據(jù)庫(kù)中存儲(chǔ)時(shí)間感到好奇。在下一節(jié)中,你將會(huì)了解到這一點(diǎn)。
在Python中獲取當(dāng)前的Unix時(shí)間
計(jì)算機(jī)喜歡數(shù)字。但日期和時(shí)間是有趣的人類(lèi)數(shù)字,遵循有趣的規(guī)則。一天有24個(gè)小時(shí)?一小時(shí)內(nèi)有60分鐘?這是誰(shuí)的聰明主意?
為了簡(jiǎn)化問(wèn)題,并考慮到計(jì)算機(jī)并不介意大數(shù)字,在開(kāi)發(fā)Unix操作系統(tǒng)的某個(gè)時(shí)候,人們做出了一個(gè)決定。
這個(gè)決定是將所有時(shí)間表示為自1970年1月1日UTC午夜以來(lái)所經(jīng)過(guò)的秒數(shù)。這個(gè)時(shí)間點(diǎn)也被稱(chēng)為Unix紀(jì) 元。該時(shí)間系統(tǒng)被稱(chēng)為Unix時(shí)間。今天的大多數(shù)計(jì)算機(jī)系統(tǒng)--甚至是Windows--都使用Unix時(shí)間來(lái)表示內(nèi)部時(shí)間。
1970年1月1日UTC午夜的Unix時(shí)間為零。如果你想知道當(dāng)前的Unix時(shí)間,那么你可以使用另一種日期時(shí)間方法。
>>> from datetime import datetime >>> datetime.now().timestamp() 1669123919.331225
.timestamp()方法返回自Unix紀(jì) 元以來(lái)的秒數(shù),精度很高。畢竟,在所有的屬性和方法之下,每一個(gè)日期對(duì)于大多數(shù)計(jì)算機(jī)來(lái)說(shuō)都不過(guò)是一個(gè)大數(shù)字而已。
在大多數(shù)情況下,你可以不去管Unix時(shí)間。這是一種代表時(shí)間的方式,對(duì)計(jì)算機(jī)來(lái)說(shuō)很有效,但對(duì)那些習(xí)慣于人類(lèi)日歷(如公歷)的人來(lái)說(shuō)卻不是。不過(guò),Unix時(shí)間戳?xí)霈F(xiàn)在你的日期和時(shí)間探索之旅中,所以它們絕對(duì)是值得了解的。
一個(gè)正確生成的Unix時(shí)間戳最棒的一點(diǎn)是,它明確地捕捉了全世界的某個(gè)時(shí)刻。Unix的紀(jì) 元總是在UTC,所以在時(shí)區(qū)偏移方面沒(méi)有任何歧義--也就是說(shuō),如果你能可靠地創(chuàng)建不偏離UTC的時(shí)間戳。
但不幸的是,你經(jīng)常不得不處理混亂的時(shí)區(qū)問(wèn)題。不過(guò),千萬(wàn)不要害怕!在下一節(jié)中,你將會(huì)了解到如何處理時(shí)區(qū)問(wèn)題。在下一節(jié)中,你將了解認(rèn)識(shí)時(shí)區(qū)感知的數(shù)據(jù)時(shí)間對(duì)象。
獲取與時(shí)區(qū)相關(guān)的Python時(shí)間和日期對(duì)象
Unix時(shí)間戳的明確性很有吸引力,但一般來(lái)說(shuō),用ISO 8601格式來(lái)序列化時(shí)間和日期會(huì)更好,因?yàn)槌吮阌谟?jì)算機(jī)分析外,它也是人類(lèi)可讀的,而且是一個(gè)國(guó)際標(biāo)準(zhǔn)。
更重要的是,盡管Unix的時(shí)間戳在某種程度上是可識(shí)別的,但它們可能會(huì)被誤認(rèn)為代表其他東西。畢竟,它們只是數(shù)字而已。有了ISO時(shí)間戳,你馬上就知道它代表什么。引用Python之禪的話來(lái)說(shuō),就是可讀性很重要。
如果你想用完全明確的術(shù)語(yǔ)表示你的日期時(shí)間對(duì)象,那么你首先需要讓你的對(duì)象具有時(shí)區(qū)意識(shí)。一旦你有了一個(gè)時(shí)區(qū)感知的對(duì)象,時(shí)區(qū)信息就會(huì)被添加到你的ISO時(shí)間戳中。
>>> from datetime import datetime >>> now = datetime.now() >>> print(now.tzinfo) None >>> now_aware = now.astimezone() >>> print(now_aware.tzinfo) Romance Standard Time >>> now_aware.tzinfo datetime.timezone(datetime.timedelta(seconds=3600), 'Romance Standard Time') >>> now_aware.isoformat() '2022-11-22T14:31:59.331225+01:00'
在這個(gè)例子中,首先證明now對(duì)象沒(méi)有任何時(shí)區(qū)信息,因?yàn)樗?.tzinfo屬性返回 none。當(dāng)你在沒(méi)有任何參數(shù)的情況下對(duì)now調(diào)用 .astimezone()時(shí),本地系統(tǒng)的時(shí)區(qū)會(huì)被用來(lái)用一個(gè)時(shí)區(qū)對(duì)象填充 .tzinfo。
一個(gè)時(shí)區(qū)對(duì)象本質(zhì)上只是一個(gè)與UTC時(shí)間的偏移量和一個(gè)名稱(chēng)。在這個(gè)例子中,本地時(shí)區(qū)的名稱(chēng)是羅曼斯標(biāo)準(zhǔn)時(shí)間,偏移量是3600秒,或一個(gè)小時(shí)。
現(xiàn)在數(shù)據(jù)時(shí)間對(duì)象有一個(gè)時(shí)區(qū)對(duì)象,你可以認(rèn)為它是時(shí)區(qū)感知的。因此,當(dāng)你對(duì)時(shí)區(qū)感知對(duì)象調(diào)用 .isoformat()時(shí),你會(huì)注意到+01:00被加在了結(jié)尾。這代表了與UTC時(shí)間的一小時(shí)偏移。
如果你在不同的地方,例如秘魯?shù)睦R,那么你的 .isoformat()輸出可能看起來(lái)像這樣。
>>> now_aware.isoformat() '2022-11-22T07:31:59.331225-06:00'
時(shí)間會(huì)有所不同,你會(huì)看到UTC的偏移量現(xiàn)在是-06:00。所以,現(xiàn)在你的時(shí)間戳看起來(lái)不錯(cuò),而且在代表時(shí)間方面是明確的。
你甚至可以像許多人一樣,更進(jìn)一步,將你的時(shí)間戳存儲(chǔ)為UTC時(shí)間,這樣一切都會(huì)很好地規(guī)范化。
>>> from datetime import datetime, timezone >>> now = datetime.now() >>> now.isoformat() '2022-11-22T14:31:59.331225' >>> now_utc = datetime.now(timezone.utc) >>> now_utc.isoformat() '2022-11-22T13:31:59.331225+00:00'
將 timezone.utc時(shí)區(qū)傳遞給 .now()構(gòu)造函數(shù)方法將返回一個(gè)UTC時(shí)間。請(qǐng)注意,在這個(gè)例子中,時(shí)間與當(dāng)?shù)貢r(shí)間有偏差。
ISO 8601標(biāo)準(zhǔn)也接受用Z代替+00:00來(lái)表示UTC時(shí)間。這有時(shí)被稱(chēng)為祖魯時(shí)間,這也是它在航空領(lǐng)域的稱(chēng)呼。
在航空領(lǐng)域,必須在UTC時(shí)間內(nèi)操作。無(wú)論在什么地方,在一個(gè)共同的時(shí)間內(nèi)操作,在像航空這樣的領(lǐng)域是至關(guān)重要的。想象一下,空中交通管制部門(mén)必須處理每架飛機(jī)根據(jù)其出發(fā)地報(bào)告的估計(jì)降落時(shí)間。如若不然會(huì)造成混亂和災(zāi)難!
結(jié)論
在本教程中,我們已經(jīng)掌握了時(shí)間!你已經(jīng)生成了一個(gè)日期時(shí)間對(duì)象,并看到了如何挑選出該對(duì)象的不同屬性。你還研究了幾種以不同格式輸出日期時(shí)間對(duì)象的方法。
你還熟悉了UNIX時(shí)間和ISO時(shí)間戳,探索了如何明確地表示你的時(shí)間戳。為此,你已經(jīng)涉足了復(fù)雜的時(shí)區(qū)世界,并使你的數(shù)據(jù)時(shí)間對(duì)象具有時(shí)區(qū)意識(shí)。
到此這篇關(guān)于Python表示當(dāng)前時(shí)間的方法合集的文章就介紹到這了,更多相關(guān)Python表示當(dāng)前時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)Logger打印功能的方法詳解
最近工作中遇到了打印的需求,通過(guò)查找相關(guān)的資料發(fā)現(xiàn)Python中Logger可以很好的實(shí)現(xiàn)打印,所以下面這篇文章主要給大家介紹了關(guān)于Python如何實(shí)現(xiàn)Logger打印功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09解決python3安裝pandas出錯(cuò)的問(wèn)題
這篇文章主要介紹了解決python3安裝pandas出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python中單下劃線與雙下劃線的區(qū)別及說(shuō)明
這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09?分享4款Python 自動(dòng)數(shù)據(jù)分析神器
這篇文章主要給大家分享的是4款Python 自動(dòng)數(shù)據(jù)分析神器,我給大家分享 4 款常用的EDA工具,它們可以自動(dòng)產(chǎn)出統(tǒng)計(jì)數(shù)據(jù)和圖表,為我們節(jié)省大量時(shí)間,需要的朋友可以參考一下2022-03-03python 環(huán)境安裝及編輯器配置方法小結(jié)
這篇文章主要介紹了python 環(huán)境安裝及編輯器配置方法小結(jié)的相關(guān)資料,需要的朋友可以參考下2021-06-06Python?sklearn庫(kù)中的隨機(jī)森林模型詳解
本文主要說(shuō)明?Python?的?sklearn?庫(kù)中的隨機(jī)森林模型的常用接口、屬性以及參數(shù)調(diào)優(yōu)說(shuō)明,需要讀者或多或少了解過(guò)sklearn庫(kù)和一些基本的機(jī)器學(xué)習(xí)知識(shí)2023-08-08