Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
絡編程之時間格式。
同學們好,今天我們分享的是如何讓搜索引擎等程序更容易地提取網(wǎng)頁中的時間信息。我們將使用time標簽來實現(xiàn)這一目標。這個標簽你們可能已經(jīng)有所了解,但是現(xiàn)在不需要掌握太多細節(jié),只需要知道它的作用即可。
現(xiàn)在來看看我們的示例頁面,可以看到頁面中包含了很多句不同時間格式的文字。這些文字并沒有什么特別之處,只是每一句都包含著時間信息。時間信息的格式比較復雜,但是這不影響我們的演示效果。
接下來,我們將介紹實現(xiàn)代碼。time標簽用于定義公歷日期或時間、二十四小時制,時間和時區(qū)偏移是可選的。在所有瀏覽器中,time標簽不會渲染任何特殊的效果。但是,它可以讓搜索引擎更容易地在網(wǎng)頁中找到對應的時間信息。
使用time標簽的另一個原因是,世界上有許多不同的日期格式,但是這些不同的格式不容易被電腦識別。如果我們想自動抓取頁面上所有事件的日期并將它們插入到日歷中,time元素可以讓我們附上清晰的可被機器識別的時間或日期。因此,time標簽并不是為了給用戶看的,而是為了方便搜索引擎更好地在網(wǎng)頁上找到對應的時間。
在我們的示例中,時間和普通文字看上去沒有任何區(qū)別。除了搜索引擎,網(wǎng)頁同手機上的日歷、提醒等應用程序交互時,time標簽也可以提供很大的方便。
time標簽非常簡單,只包含一個屬性datatime,用于規(guī)定日期和時間。如果需要,我們還可以通過元素的內(nèi)容來指定日期和時間。time標簽的值有很多種,只要是符合規(guī)范的時間寫法格式,都可以被接受并轉(zhuǎn)化為第三方使用的格式。
總之,time標簽的使用頻率并不高,不需要我們進行太多的學習和理解。如果你們知道有這個東西并且知道它的大概意思,就可以了。
今天的分享就到這里,所有的案例和相關文檔都可以向我索取。
下期見,想學習編程的同學請關注我。
為開發(fā)人員,我們依賴于靜態(tài)分析工具來檢查、lint(分析)和轉(zhuǎn)換我們的代碼。我們使用這些工具來幫助我們提高生產(chǎn)效率并生成更好的代碼。然而,當我們使用markdown編寫內(nèi)容時,可用的工具就很少。
在本文中,我們將介紹如何開發(fā)一個Markdown擴展來解決在使用Markdown管理Django站點中的內(nèi)容時遇到的挑戰(zhàn)。
你認為他們有l(wèi)inter嗎?
照片來自Pexels,由mali maeder拍攝
像每個網(wǎng)站一樣,我們在主頁、FAQ部分和“關于”頁面等地方都有不同類型的(大部分)靜態(tài)內(nèi)容。很長一段時間以來,我們都是在Django模板中直接管理這些內(nèi)容的。
當我們最終決定是時候?qū)⑦@些內(nèi)容從模板轉(zhuǎn)移到數(shù)據(jù)庫中時,我們認為最好使用Markdown。從Markdown生成HTML更安全,它提供了一定程度的控制和一致性,并且對于非技術用戶來說更容易處理。隨著我們轉(zhuǎn)移過程的進展,我們注意到我們遺漏了一些東西:
當URL更改時,鏈接到內(nèi)部頁面的鏈接可能會中斷。在Django模板和視圖中,我們使用了reverseand {% url %},但是這在普通的Markdown中是不可用的。
絕對內(nèi)部連接不能在不同環(huán)境之間進行復制。這可以使用相對鏈接來解決,不過目前沒有開箱即用的增強這一點的方法。
無效鏈接會損害用戶體驗,并導致用戶質(zhì)疑整個內(nèi)容的可靠性。這并不是Markdown獨有的東西,只不過HTML模板是由對URL有一定了解的開發(fā)人員維護的。另一方面,Markdown文檔是為非技術寫作人員設計的。
當我研究這個問題時,我搜索了Python linters、Markdown預處理器和擴展來幫助生成更好的Markdown。結果都不是很好。一個引人注目的方法是使用Django模板來生成Markdown文檔。
使用Django模板,你可以使用諸如url之類的模板標記來反向查詢URL名稱,并配合使用條件、變量、日期格式和所有其他Django模板特性。這種方法本質(zhì)上是使用Django模板作為Markdown文檔的預處理程序。
我個人認為這可能不是非技術作家的最佳解決方案。另外,我擔心提供對Django模板標記的訪問可能是危險的。
對這個問題有了更好的理解之后,我們準備在Python中更深入地研究Markdown。
要在Python中開始使用Markdown,我們先安裝markdown包:
接著,創(chuàng)建一個Markdown對象并使用其函數(shù)將一些Markdown轉(zhuǎn)換成HTML:
你現(xiàn)在可以在你的模板中使用這個HTML代碼片段。
基本的Markdown處理器提供了生成HTML內(nèi)容的基本要素。對于更“新奇”的選項,Python markdown包包含了一些內(nèi)置擴展。一個流行的擴展是“extra”擴展,除了其他東西之外,它增加了對隔離代碼塊的支持:
為了使用我們獨特的Django功能擴展Markdown,我們將開發(fā)自己的擴展。
如果你查看源代碼,你將看到要將markdown轉(zhuǎn)換為HTML, Markdown會使用多種不同的處理器。一種類型的處理器是內(nèi)聯(lián)處理器。內(nèi)聯(lián)處理器會匹配特定的內(nèi)聯(lián)模式,如鏈接、反引號、粗體文本和帶下劃線的文本,并將它們轉(zhuǎn)換為HTML。
我們的Markdown擴展的主要目的是驗證和轉(zhuǎn)換鏈接。因此,我們最感興趣的內(nèi)聯(lián)處理器是LinkInlineProcessor。這個處理器以[Haki的網(wǎng)站](https://hakibenito.com)的形式獲取markdown ,解析它并返回一個包含鏈接和文本的元組。
為了擴展該功能,我們擴展了LinkInlineProcessor并創(chuàng)建了一個Markdown.Extension, 我們用它來處理鏈接:
我們來將這段代碼分解一下::
DjangoUrlExtension擴展注冊了一個名為DjangoLinkInlineProcessor的內(nèi)聯(lián)鏈接處理器。這個處理器將取代任何其他現(xiàn)有的鏈接處理器。
內(nèi)聯(lián)處理器DjangoLinkInlineProcessor擴展了內(nèi)置的LinkInlineProcessor,并在它處理的每個鏈接上調(diào)用clean_link函數(shù)。
clean_link函數(shù)接收一個鏈接和一個域名,并返回一個轉(zhuǎn)換后的鏈接。這就是我們要插入我們的實現(xiàn)的地方。
如何獲得網(wǎng)站域名
要識別到你自己網(wǎng)站的鏈接,你必須知道你的網(wǎng)站的域名。如果你正在使用Django的sites框架,那么你可以使用它來獲取當前域名。
我沒有把它包含在我的實現(xiàn)中,因為我們沒有使用sites框架。相反,我們在Django設置中設置了一個變量。
獲取當前域名的另一種方法是使用HttpRequest對象。如果內(nèi)容只在你自己的站點中被編輯,你可以嘗試從請求對象中插入站點域名。這可能需要對你的實現(xiàn)進行一些更改。
要使用該擴展,請在初始化一個新的Markdown實例時添加它:
太好了,這個擴展已經(jīng)被使用了,我們準備進入有趣的部分了!
既然我們得到了在所有鏈接上調(diào)用clean_link的擴展,那我們可以來實現(xiàn)我們的驗證和轉(zhuǎn)換邏輯。
要開始工作,我們將從一個簡單的驗證開始。mailto鏈接對于使用預定義的收件人地址、主題甚至消息正文打開用戶的電子郵件客戶端非常有用。
一個常見的mailto鏈接是這樣的:
這個鏈接將打開你的電子郵件客戶端,并設置成撰寫一封主題行為“我需要幫助!”的新電子郵件給“support@service.com”。
mailto鏈接不一定非要包含電子郵件地址。如果你看一看這篇文章底部的“分享”按鈕,你會發(fā)現(xiàn)像這樣的一個mailto鏈接:
這個mailto鏈接沒有包含收件人,僅包含了主題行和消息正文。
既然我們已經(jīng)很好地理解了mailto鏈接是什么樣子的,我們就可以向clean_link函數(shù)添加第一個驗證:
為了驗證mailto鏈接,我們向clean_link中添加了以下代碼:
檢查鏈接是否以mailto:開頭,以識別相關鏈接。
使用正則表達式將鏈接分割到它的組件。
從mailto鏈接中刪除實際的電子郵件地址,并使用Django的EmailValidator驗證它。
注意,我們還添加了一種名為InvalidMarkdown的新異常類型。我們定義了自己的自定義異常類型,以將它與markdown本身所引發(fā)的其他錯誤區(qū)分開來。
自定義錯誤類
我曾經(jīng)寫過關于自定義錯誤類的文章,為什么它們是有用的,以及你什么時候應該使用它們。
在我們繼續(xù)之前,讓我們添加一些測試,看看它的實際效果:
太棒了!按預期的運行了。
既然我們已經(jīng)了解了mailto鏈接,我們也可以處理其他類型的鏈接:
外部鏈接
我們的Django應用程序外部的鏈接。
必須包含一個頁面跳轉(zhuǎn)協(xié)議(scheme):http或https。
理想情況下,我們還希望確保這些鏈接沒有被破壞,但我們現(xiàn)在不會這樣做。
內(nèi)部鏈接
到我們的Django應用程序中的頁面的鏈接。
鏈接必須是相對的:這將允許我們在不同環(huán)境之間移動內(nèi)容。
使用Django的URL名稱而不是一個URL路徑:這將允許我們安全地來回移動視圖,而不必擔心markdown內(nèi)容中的失效鏈接。
鏈接可能包含查詢參數(shù)(?)和片段(#)。
SEO
從SEO的角度來看,公共URL不應該改變。當他們這樣做的時候,你應該使用重定向正確地處理它,否則你可能會受到搜索引擎的懲罰。
有了這個需求列表,我們就可以開始工作了。
解析URL名稱
要鏈接到內(nèi)部頁面,我們希望編寫者提供一個URL名稱,而不是URL路徑。例如,假設我們有這個視圖:
這個頁面的URL路徑是https://example.com/, URL名稱是home。我們想要在我們的markdown鏈接中使用這個URL名稱home,就像這樣:
這將渲染到:
我們還想支持查詢參數(shù)和散列:
這將渲染到以下HTML:
在使用URL名稱時,如果我們更改了URL路徑,內(nèi)容中的鏈接將不會被破壞。要檢查作者提供的href是否是一個有效的url_name,我們可以嘗試reverse它:
URL名稱“home”指向URL路徑“/”。當沒有匹配項時,將會引發(fā)一個異常:
在我們繼續(xù)之前,當URL名稱包含查詢參數(shù)或散列時,會發(fā)生什么:
這是有意義的,因為查詢參數(shù)和散列不是URL名稱的一部分。
要使用reverse并支持查詢參數(shù)和散列,我們首先需要清除值。然后,檢查它是一個有效的URL名稱,并返回包含查詢參數(shù)和散列的URL路徑,如果提供了的話:
這個代碼段使用一個正則表達式來以?或#的出現(xiàn)對href進行分割,并返回各部分。
請確保它可以工作:
太了不起了!作者們現(xiàn)在可以在Markdown中使用URL名稱了。它們還可以包括要添加到該URL的查詢參數(shù)和片段。
處理外部鏈接
要正確處理外部鏈接,我們需要檢查兩件事:
1.外部鏈接總是提供一個跳轉(zhuǎn)協(xié)議,http:或者https:。
2.阻止到我們自己網(wǎng)站的絕對鏈接。內(nèi)部鏈接應該使用URL名稱。
到目前為止,我們已經(jīng)處理了URL名稱和mailto鏈接。如果我們通過了這兩個檢查,這意味著href是一個URL。讓我們從檢查鏈接是否是鏈接到我們自己的網(wǎng)站開始:
函數(shù)urlparse會返回一個命名元組,該元組包含URL的不同部分。如果netloc屬性等于site_domain,那么該鏈接就確實是一個內(nèi)部鏈接。
如果URL實際上是內(nèi)部的,我們就需要終止。但是,請記住,作者們不一定是技術人員,因此我們希望幫助他們,并提供一個有用的錯誤消息。我們要求該內(nèi)部鏈接使用URL名稱而不是URL路徑,所以最好讓作者們知道他們提供的路徑的URL名稱。
要獲得一個URL路徑的URL名稱,Django為我們提供了一個名為resolve的函數(shù):
當找到匹配項時,resolve會返回一個ResolverMatch對象,其中包含URL名稱和其他信息。當沒有找到匹配項時,它就會引發(fā)一個錯誤:
這實際上就是Django在底層所做的工作,用來確定在一個新請求到來時執(zhí)行哪個視圖函數(shù)。
為了給作者們提供更好的錯誤信息,我們可以使用來自ResolverMatch對象的URL名稱:
當我們識別出內(nèi)部鏈接時,我們要處理兩種情況:
我們沒有識別出這個URL:這個URL很可能是不正確的。請作者檢查該URL是否有錯誤。
我們識別出了這個URL: 這個URL是正確的,所以就告訴作者應該使用什么URL名稱。
我們來實際地看一下它:
漂亮!外部鏈接被接受,內(nèi)部鏈接被拒絕,并帶有一個有用的消息。
要求跳轉(zhuǎn)協(xié)議
我們要做的最后一件事是確保外部鏈接包含一個跳轉(zhuǎn)協(xié)議,要么是http:,要么是https:。讓我們將這最后一部分添加到函數(shù)clean_link:
使用解析后的URL,我們可以很容易地檢查跳轉(zhuǎn)協(xié)議。讓我們確保它正在工作:
我們向這個函數(shù)提供了一個沒有跳轉(zhuǎn)協(xié)議的鏈接,但是它運行失敗了,并顯示了一條有用的消息。太酷了!
這是clean_link函數(shù)的全部代碼:
要了解所有這些特性的一個實際用例是什么樣子的,請看下面的內(nèi)容:
這將產(chǎn)生以下HTML:
不錯!
我們現(xiàn)在有一個很不錯的擴展,它可以驗證和轉(zhuǎn)換Markdown文檔中的鏈接!現(xiàn)在,在不同環(huán)境之間移動文檔和保持內(nèi)容整潔要容易多了,最重要的是,可以保持正確和最新!
源碼
你可以在這個gist中找到全部源代碼。(地址:https://gist.github.com/hakib/73fccc340e855bb65f42197e298c0c7d )
本文中所描述的功能對我們很有用,但是你可能需要根據(jù)自己的需求對它進行調(diào)整。
如果你需要一些想法,那么除了這個擴展之外,我們還創(chuàng)建了一個markdown Preprocessor,它允許作者們在markdown中使用常量。例如,我們定義了一個名為SUPPORT_EMAIL的常量,我們像這樣使用它:
該預處理程序?qū)⒂梦覀兌x的文本替換字符串$SUPPORT_EMAIL,然后才渲染Markdown。
英文原文:https://hakibenita.com/django-markdown
譯者:Nothing
者:Peter
來源:Python編程時光
在生活和工作中,我們每個人每天都在和時間打交道:
不同的情況會遇到不同的時間問題:具體時間點、時間間隔、星期等,無時不刻我們在和時間碰撞。本文將利用Python對時間相關的類,及其方法與屬性等進行詳細的講解
在正式講解時間的相關函數(shù)之前,我們必須先一個概念:時間戳。本文中特指unix時間戳。
時間戳Timestamp是指在一連串的數(shù)據(jù)中加入辨識文字,如時間或者日期等,用以保障本地數(shù)據(jù)更新順序和遠程的一致。
unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),不考慮閏秒。1970-01-01就是經(jīng)常我們在MySQL中時間為空的時候,轉(zhuǎn)化空的時間戳之后得到的時間。一個小時表示為UNIX時間戳格式為:3600秒;一天表示為UNIX時間戳為86400秒,閏秒不計算。具體的對照表如下:
下面介紹幾個時間戳和具體時間之間相互轉(zhuǎn)化的網(wǎng)站:
1、站長工具:https://tool.chinaz.com/tools/unixtime.aspx
2、在線工具:https://tool.lu/timestamp/
3、Json在線解析:https://www.sojson.com/unixtime.html
4、Unix時間戳在線轉(zhuǎn)換(菜鳥工具):https://c.runoob.com/front-end/852
5、北京時間(時間與時間戳互換工具):http://www.beijing-time.org/shijianchuo/
介紹完時間戳的基本知識,下面重點講解3個與時間和日期相關的Python庫:
calendar的中文意思是"日歷",所以它其實適合進行日期,尤其是以日歷的形式展示。
下面舉例說明:
我們顯示即將過去2020年的日歷,使用默認的參數(shù):
import calendar
year = calendar.calendar(2020)
print(year)
改變參數(shù)再來顯示一次:
year = calendar.calendar(2020,w=3,l=1,c=8)
print(year)
我們發(fā)現(xiàn)整個日歷變寬了,而且星期的英文也是3個字母來顯示的,解釋一下3個參數(shù)的含義:
其中每行長度為:21*w+18+2*c,3個月一行
最后,看看即將到來的2021年日歷:
該函數(shù)的作用是判斷某個年份到底是不是閏年。如果是則返回True,否則返回的是False。
普通年份能夠被4整除,但是不能被100整除,稱之為普通閏年
年份是整百數(shù)的,必須能夠被400整除,稱之為世紀閏年
判斷兩個年份之間有多少個閏年,包含y1,但是不包含y2,類似Python切片中的包含頭部不包含尾部
該函數(shù)返回的是year年的month月的日歷,只有兩行標題,一周一行。每日間隔寬度為w個字符,每行的長度為7*w + 6,其中l(wèi)是每星期的行數(shù)
首先看看默認效果;
接下來我們改變w和l兩個參數(shù):
1、改變w,我們發(fā)現(xiàn)星期的表示變成了3個字母;同時每天之間的間隔變寬了(左右間隔)
2、改變參數(shù)l,我們發(fā)現(xiàn)每個星期之前的間隔(上下)變寬了
通過列表的形式返回year年month月的日歷,列表中還是列表形式。每個子列表是一個星期。如果沒有本月的日期則用0表示。每個子列表都是從星期1開始的,特點概括如下:
我們還是以2020年12月份為例:
和上面的日歷進行對比,我們發(fā)現(xiàn):出現(xiàn)0的位置的確是沒有出現(xiàn)在12月份中
我們再看看2020年3月份的日歷:
該函數(shù)返回的結果是一個元組,元組中有兩個數(shù)值(a,b)
通過一個例子來講解,還是以2020年12月份為例:
結果中的1表示12月份從星期2開始(0-6,6代表星期日),該月總共31天
weekday方法是輸入年月日,我們便可知道這天是星期幾;返回值是0-6,0代表星期1,6代表星期天
通過一個例子來講解,以12月12號為例:
雙12是星期六,返回的結果是5,5代表的就是星期六,剛好吻合。
time模塊是涉及到時間功能中最常用的一個模塊,在Python的相關時間需求中經(jīng)常會用到,下面具體講解該模塊的使用方法。
先看模塊的整體使用
time.time()是獲取當前的時間,更加嚴格地說,是獲取當前時間的時間戳。
再次理解時間戳:它是以1970年1月1日0時0份0秒為計時起點,計算到當前的時間長度(不考慮閏秒)
time.localtime是打印當前的時間,得到的結果是時間元組,具體含義:
筆記:結果是時間元組
time.localtime的參數(shù)默認是time.time()的時間戳,可以自己輸入某個時間戳來獲取其對應的時間
localtime()得到的是本地時間,如果需要國際化,使用gmtime(),最好是使用格林威治時間。
格林威治標準時間:位于英國倫敦郊區(qū)的皇家格林威治天文臺的標準時間,本初子午線經(jīng)過那里。
time.asctime的參數(shù)為空時,默認是以time.localtime的值為參數(shù),得到當前的日期、時間、星期;另外,我們也可以自己設置參數(shù),參數(shù)是時間元組
獲取當前時間的具體時間和日期:
ctime的參數(shù)默認是時間戳;如果沒有,也可以指定一個時間戳
mktime()也是以時間元組為參數(shù)的,它返回的是時間戳,相當于是localtime的逆向過程:
strftime()是按照我們指定的格式將時間元組轉(zhuǎn)化為字符串;如果不指定時間元組,默認是當前時間localtime()。常用到的時間格式見下表:
我們舉例說明:
strptime()是將字符串轉(zhuǎn)化為時間元組,我們需要特別注意的是,它有兩個參數(shù):
雖然time模塊已經(jīng)能夠解決很多的問題,但是實際工作和業(yè)務需求中需要更多的工具,讓我們使用起來更方便和快捷,datetime便是其中一個很好用的模塊。datetime模塊中幾個常用的類如下:
首先我們引入date類,并創(chuàng)建一個日期對象:
1、然后我們可以操作這個日期對象的各種屬性:后面加上()
print("當前日期:",today) # 當前日期
print("當前日期(字符串):",today.ctime()) # 返回日期的字符串
print("時間元組信息:",today.timetuple()) # 當前日期的時間元組信息
print("年:",today.year) # 返回today對象的年份
print("月:",today.month) # 返回today對象的月份
print("日:",today.day) # 返回today對象的日
print("星期:",today.weekday()) # 0代表星期一,類推
print("公歷序數(shù):",today.toordinal()) # 返回公歷日期的序數(shù)
print("年/周數(shù)/星期:",today.isocalendar()) # 返回一個元組:一年中的第幾周,星期幾
# 結果顯示
當前日期: 2020-12-25
當前日期(字符串):Fri Dec 25 00:00:00 2020
時間元組信息:time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=360, tm_isdst=-1)
年: 2020
月: 12
日: 25
星期: 4
公歷序數(shù): 737784
年/周數(shù)/星期: (2020, 52, 5)
2、date類中時間和時間戳的轉(zhuǎn)換:
具體時間的時間戳轉(zhuǎn)成日期:
3、格式化時間相關,格式參照time模塊中的strftime方法
from datetime import datetime, date, time
today = date.today()
print(today)
# 2020-12-26 默認連接符號是-
print(today.strftime("%Y/%m/%d")) # 指定連接符
# 2020/12/26
print(today.strftime("%Y:%m:%d"))
# 2020:12:26
print(today.strftime("%Y/%m/%d %H:%M:%S")) # 轉(zhuǎn)化為具體的時間
# 2020/12/26 00:00:00
4、修改日期使用replace方法
time類也是要生成time對象,包含hour、minute、second、microsecond,我們還是通過例子來學習:
from datetime import time
t = time(10,20,30,40)
print(t.hour) # 時分秒
print(t.minute)
print(t.second)
print(t.microsecond) # 微秒
# 結果
10
20
30
40
datetime類包含date類和time類的全部信息,下面是類方法相關的:
from datetime import datetime
print(datetime.today())
print(datetime.now())
print(datetime.utcnow())# 返回當前UTC日期和時間的datetime對象
print(datetime.fromtimestamp(1697302830)) # 時間戳的datetime對象
print(datetime.fromordinal(699000) )
print(datetime.combine(date(2020,12,25), time(11,22,54))) # 拼接日期和時間
print(datetime.strptime("2020-12-25","%Y-%m-%d"))
# 結果
2020-12-25 23:24:42.481845
2020-12-25 23:24:42.482056
2020-12-25 15:24:42.482140
2023-10-15 01:00:30
1914-10-19 00:00:00
2020-12-25 11:22:54
2020-12-25 00:00:00
再看看相關對象和屬性相關:
from datetime import datetime
d = datetime(2020,12,25,11,24,23)
print(d.date())
print(d.time())
print(d.timetz()) # 從datetime中拆分出具體時區(qū)屬性的time
print(d.replace(year=2021,month=1)) # 替換
print(d.timetuple()) # 時間元組
print(d.toordinal()) # 和date.toordinal一樣
print(d.weekday())
print(d.isoweekday())
print(d.isocalendar())
print(d.isoformat())
print(d.strftime("%Y-%m-%d :%H:%M:%S"))
# 結果
2020-12-25
11:24:23
11:24:23
2021-01-25 11:24:23
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=11, tm_min=24, tm_sec=23, tm_wday=4, tm_yday=360, tm_isdst=-1)
737784
4
5
(2020, 52, 5)
2020-12-25T11:24:23
2020-12-25 :11:24:23
timedelta對象表示的是一個時間段,即兩個日期date或者日期時間datetime之間的差;支持參數(shù):weeks、days、hours、minutes、seconds、milliseconds、microseconds
本地時間指的是我們系統(tǒng)本身設定時區(qū)的時間,例如中國處于北京時間,常說的東八區(qū)UTC+8:00。datetime類有一個時區(qū)屬性tzinfo。
tzinfo是一個關于時區(qū)信息的類,是一個抽象的基類,不能直接被實例化來使用。它的默認值是None,無法區(qū)分具體是哪個時區(qū),需要我們強制指定一個之后才能使用。
因為本身系統(tǒng)的時區(qū)剛好在中國處于東八區(qū),所以上述代碼是能夠正常運行的,結果也是OK的。那如果我們想切換到其他時區(qū)的時間,該如何操作呢?這個時候我們需要進行時區(qū)的切換。
1、我們先通過utcnow()獲取到當前的UTC時間
utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) # 指定utc時區(qū)
print(utc_now)
# 結果
2020-12-26 01:36:33.975427+00:00
2、通過astimezone()將時區(qū)指定為我們想轉(zhuǎn)換的時區(qū),比如東八區(qū)(北京時間):
# 通過astimezone切換到東八區(qū)
beijing = utc_now.astimezone(timezone(timedelta(hours=8)))
print(beijing)
# 結果
2020-12-26 09:36:33.975427+08:00
用同樣的方法切到東九區(qū),東京時間:
# UTC時區(qū)切換到東九區(qū):東京時間
tokyo = utc_now.astimezone(timezone(timedelta(hours=9)))
print(tokyo)
# 結果
2020-12-26 10:36:33.975427+09:00
還可以直接從北京時間切換到東京時間:
# 北京時間(東八區(qū))直接切換到東京時間(東九區(qū))
tokyo_new = beijing.astimezone(timezone(timedelta(hours=9)))
print(tokyo_new)
# 結果
2020-12-26 10:36:33.975427+09:00
下面介紹幾個工作中用到的時間轉(zhuǎn)化小技巧:
時間戳轉(zhuǎn)成具體時間,我們需要兩個函數(shù):
import time
now_timestamp = time.time() # 獲取當前時間的時間戳
# 時間戳先轉(zhuǎn)成時間元組,strftime在轉(zhuǎn)成指定格式
now_tuple = time.localtime(now_timestamp)
time.strftime("%Y/%m/%d %H:%M:%S", now_tuple)
# 結果
'2020/12/26 11:19:01'
假設我們指定一個具體的時間戳來進行轉(zhuǎn)換:
import time
timestamp = 1608852741 # 指定時間戳
a = time.localtime(timestamp) # 獲得時間元組形式數(shù)據(jù)
print("時間元組數(shù)據(jù):",a)
time.strftime("%Y/%m/%d %H:%M:%S", a) # 格式化
# 結果
時間元組數(shù)據(jù):time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=7, tm_min=32, tm_sec=21, tm_wday=4, tm_yday=360, tm_isdst=0)
'2020/12/25 07:32:21'
如果我們不想指定具體的格式,只想獲取時間戳對應的時間,直接通過time.ctime即可:
import time
time.ctime(1608852741)
# 結果
'Fri Dec 25 07:32:21 2020'
日期時間轉(zhuǎn)成時間戳格式,我們需要使用兩個方法:
通過具體的案例來學習一下:
date = "2020-12-26 11:45:34"
# 1、時間字符串轉(zhuǎn)成時間數(shù)組形式
date_array = time.strptime(date, "%Y-%m-%d %H:%M:%S")
# 2、查看時間數(shù)組數(shù)據(jù)
print("時間數(shù)組:", date_array)
# 3、mktime時間數(shù)組轉(zhuǎn)成時間戳
time.mktime(date_array)
# 結果
時間數(shù)組:time.struct_time(tm_year=2020, tm_mon=12, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=5, tm_yday=361, tm_isdst=-1)
1608954334.0
工作需求中有時候給定的時間格式未必是我們能夠直接使用,所以可能需要進行格式的轉(zhuǎn)換,需要使用兩個方法:
通過案例來進行學習:
import time
old = "2020-12-12 12:28:45"
# 1、轉(zhuǎn)換成時間數(shù)組
time_array = time.strptime(old, "%Y-%m-%d %H:%M:%S")
# 2、轉(zhuǎn)換成新的時間格式(20201212-20:28:54)
new = time.strftime("%Y%m%d-%H:%M:%S",time_array) # 指定顯示格式
print("原格式時間:",old)
print("新格式時間:",new)
# 結果
原格式時間: 2020-12-12 12:28:45
新格式時間: 20201212-12:28:45
為了能夠獲取到指定格式的當前時間,我們分為3個步驟:
通過一個案例來學習:
# 1、時間戳
old_time = time.time()
# 2、時間元組
time_array = time.localtime(old_time)
# 3、指定格式輸出
new_time = time.strftime("%Y/%m/%d %H:%M:%S", time_array)
print(new_time)
# 結果
2020/12/26 11:56:08
本文通過各種案例詳細介紹了Python中關于時間輸出和轉(zhuǎn)化的3個模塊:calendar、time、datetime,最后總結了4個工作中常用的時間轉(zhuǎn)化技巧,希望對大家掌握Python中的時間輸出和轉(zhuǎn)化有所幫助,不再被時間困擾。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。