整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          HTML網(wǎng)絡(luò)編程之時(shí)間格式

          絡(luò)編程之時(shí)間格式。

          同學(xué)們好,今天我們分享的是如何讓搜索引擎等程序更容易地提取網(wǎng)頁中的時(shí)間信息。我們將使用time標(biāo)簽來實(shí)現(xiàn)這一目標(biāo)。這個(gè)標(biāo)簽?zāi)銈兛赡芤呀?jīng)有所了解,但是現(xiàn)在不需要掌握太多細(xì)節(jié),只需要知道它的作用即可。

          現(xiàn)在來看看我們的示例頁面,可以看到頁面中包含了很多句不同時(shí)間格式的文字。這些文字并沒有什么特別之處,只是每一句都包含著時(shí)間信息。時(shí)間信息的格式比較復(fù)雜,但是這不影響我們的演示效果。

          接下來,我們將介紹實(shí)現(xiàn)代碼。time標(biāo)簽用于定義公歷日期或時(shí)間、二十四小時(shí)制,時(shí)間和時(shí)區(qū)偏移是可選的。在所有瀏覽器中,time標(biāo)簽不會(huì)渲染任何特殊的效果。但是,它可以讓搜索引擎更容易地在網(wǎng)頁中找到對應(yīng)的時(shí)間信息。

          使用time標(biāo)簽的另一個(gè)原因是,世界上有許多不同的日期格式,但是這些不同的格式不容易被電腦識別。如果我們想自動(dòng)抓取頁面上所有事件的日期并將它們插入到日歷中,time元素可以讓我們附上清晰的可被機(jī)器識別的時(shí)間或日期。因此,time標(biāo)簽并不是為了給用戶看的,而是為了方便搜索引擎更好地在網(wǎng)頁上找到對應(yīng)的時(shí)間。

          在我們的示例中,時(shí)間和普通文字看上去沒有任何區(qū)別。除了搜索引擎,網(wǎng)頁同手機(jī)上的日歷、提醒等應(yīng)用程序交互時(shí),time標(biāo)簽也可以提供很大的方便。

          time標(biāo)簽非常簡單,只包含一個(gè)屬性datatime,用于規(guī)定日期和時(shí)間。如果需要,我們還可以通過元素的內(nèi)容來指定日期和時(shí)間。time標(biāo)簽的值有很多種,只要是符合規(guī)范的時(shí)間寫法格式,都可以被接受并轉(zhuǎn)化為第三方使用的格式。

          總之,time標(biāo)簽的使用頻率并不高,不需要我們進(jìn)行太多的學(xué)習(xí)和理解。如果你們知道有這個(gè)東西并且知道它的大概意思,就可以了。

          今天的分享就到這里,所有的案例和相關(guān)文檔都可以向我索取。

          下期見,想學(xué)習(xí)編程的同學(xué)請關(guān)注我。

          為開發(fā)人員,我們依賴于靜態(tài)分析工具來檢查、lint(分析)和轉(zhuǎn)換我們的代碼。我們使用這些工具來幫助我們提高生產(chǎn)效率并生成更好的代碼。然而,當(dāng)我們使用markdown編寫內(nèi)容時(shí),可用的工具就很少。

          在本文中,我們將介紹如何開發(fā)一個(gè)Markdown擴(kuò)展來解決在使用Markdown管理Django站點(diǎn)中的內(nèi)容時(shí)遇到的挑戰(zhàn)。

          你認(rèn)為他們有l(wèi)inter嗎?

          照片來自Pexels,由mali maeder拍攝

          問題

          像每個(gè)網(wǎng)站一樣,我們在主頁、FAQ部分和“關(guān)于”頁面等地方都有不同類型的(大部分)靜態(tài)內(nèi)容。很長一段時(shí)間以來,我們都是在Django模板中直接管理這些內(nèi)容的。

          當(dāng)我們最終決定是時(shí)候?qū)⑦@些內(nèi)容從模板轉(zhuǎn)移到數(shù)據(jù)庫中時(shí),我們認(rèn)為最好使用Markdown。從Markdown生成HTML更安全,它提供了一定程度的控制和一致性,并且對于非技術(shù)用戶來說更容易處理。隨著我們轉(zhuǎn)移過程的進(jìn)展,我們注意到我們遺漏了一些東西:

          內(nèi)部鏈接

          當(dāng)URL更改時(shí),鏈接到內(nèi)部頁面的鏈接可能會(huì)中斷。在Django模板和視圖中,我們使用了reverseand {% url %},但是這在普通的Markdown中是不可用的。

          在不同環(huán)境之間進(jìn)行復(fù)制

          絕對內(nèi)部連接不能在不同環(huán)境之間進(jìn)行復(fù)制。這可以使用相對鏈接來解決,不過目前沒有開箱即用的增強(qiáng)這一點(diǎn)的方法。

          無效鏈接

          無效鏈接會(huì)損害用戶體驗(yàn),并導(dǎo)致用戶質(zhì)疑整個(gè)內(nèi)容的可靠性。這并不是Markdown獨(dú)有的東西,只不過HTML模板是由對URL有一定了解的開發(fā)人員維護(hù)的。另一方面,Markdown文檔是為非技術(shù)寫作人員設(shè)計(jì)的。

          前期工作

          當(dāng)我研究這個(gè)問題時(shí),我搜索了Python linters、Markdown預(yù)處理器和擴(kuò)展來幫助生成更好的Markdown。結(jié)果都不是很好。一個(gè)引人注目的方法是使用Django模板來生成Markdown文檔。

          使用Django模板預(yù)處理Markdown

          使用Django模板,你可以使用諸如url之類的模板標(biāo)記來反向查詢URL名稱,并配合使用條件、變量、日期格式和所有其他Django模板特性。這種方法本質(zhì)上是使用Django模板作為Markdown文檔的預(yù)處理程序。

          我個(gè)人認(rèn)為這可能不是非技術(shù)作家的最佳解決方案。另外,我擔(dān)心提供對Django模板標(biāo)記的訪問可能是危險(xiǎn)的。

          使用 Markdown

          對這個(gè)問題有了更好的理解之后,我們準(zhǔn)備在Python中更深入地研究Markdown。

          將Markdown轉(zhuǎn)換為HTML

          要在Python中開始使用Markdown,我們先安裝markdown包:

          接著,創(chuàng)建一個(gè)Markdown對象并使用其函數(shù)將一些Markdown轉(zhuǎn)換成HTML:

          你現(xiàn)在可以在你的模板中使用這個(gè)HTML代碼片段。

          使用Markdown擴(kuò)展

          基本的Markdown處理器提供了生成HTML內(nèi)容的基本要素。對于更“新奇”的選項(xiàng),Python markdown包包含了一些內(nèi)置擴(kuò)展。一個(gè)流行的擴(kuò)展是“extra”擴(kuò)展,除了其他東西之外,它增加了對隔離代碼塊的支持:

          為了使用我們獨(dú)特的Django功能擴(kuò)展Markdown,我們將開發(fā)自己的擴(kuò)展。

          創(chuàng)建一個(gè)Markdown擴(kuò)展來處理內(nèi)聯(lián)鏈接

          如果你查看源代碼,你將看到要將markdown轉(zhuǎn)換為HTML, Markdown會(huì)使用多種不同的處理器。一種類型的處理器是內(nèi)聯(lián)處理器。內(nèi)聯(lián)處理器會(huì)匹配特定的內(nèi)聯(lián)模式,如鏈接、反引號、粗體文本和帶下劃線的文本,并將它們轉(zhuǎn)換為HTML。

          我們的Markdown擴(kuò)展的主要目的是驗(yàn)證和轉(zhuǎn)換鏈接。因此,我們最感興趣的內(nèi)聯(lián)處理器是LinkInlineProcessor。這個(gè)處理器以[Haki的網(wǎng)站](https://hakibenito.com)的形式獲取markdown ,解析它并返回一個(gè)包含鏈接和文本的元組。

          為了擴(kuò)展該功能,我們擴(kuò)展了LinkInlineProcessor并創(chuàng)建了一個(gè)Markdown.Extension, 我們用它來處理鏈接:

          我們來將這段代碼分解一下::

          • DjangoUrlExtension擴(kuò)展注冊了一個(gè)名為DjangoLinkInlineProcessor的內(nèi)聯(lián)鏈接處理器。這個(gè)處理器將取代任何其他現(xiàn)有的鏈接處理器。

          • 內(nèi)聯(lián)處理器DjangoLinkInlineProcessor擴(kuò)展了內(nèi)置的LinkInlineProcessor,并在它處理的每個(gè)鏈接上調(diào)用clean_link函數(shù)。

          • clean_link函數(shù)接收一個(gè)鏈接和一個(gè)域名,并返回一個(gè)轉(zhuǎn)換后的鏈接。這就是我們要插入我們的實(shí)現(xiàn)的地方。

          如何獲得網(wǎng)站域名


          要識別到你自己網(wǎng)站的鏈接,你必須知道你的網(wǎng)站的域名。如果你正在使用Django的sites框架,那么你可以使用它來獲取當(dāng)前域名。


          我沒有把它包含在我的實(shí)現(xiàn)中,因?yàn)槲覀儧]有使用sites框架。相反,我們在Django設(shè)置中設(shè)置了一個(gè)變量。


          獲取當(dāng)前域名的另一種方法是使用HttpRequest對象。如果內(nèi)容只在你自己的站點(diǎn)中被編輯,你可以嘗試從請求對象中插入站點(diǎn)域名。這可能需要對你的實(shí)現(xiàn)進(jìn)行一些更改。

          要使用該擴(kuò)展,請?jiān)诔跏蓟粋€(gè)新的Markdown實(shí)例時(shí)添加它:

          太好了,這個(gè)擴(kuò)展已經(jīng)被使用了,我們準(zhǔn)備進(jìn)入有趣的部分了!

          驗(yàn)證和轉(zhuǎn)換Django鏈接

          既然我們得到了在所有鏈接上調(diào)用clean_link的擴(kuò)展,那我們可以來實(shí)現(xiàn)我們的驗(yàn)證和轉(zhuǎn)換邏輯。

          驗(yàn)證mailto鏈接

          要開始工作,我們將從一個(gè)簡單的驗(yàn)證開始。mailto鏈接對于使用預(yù)定義的收件人地址、主題甚至消息正文打開用戶的電子郵件客戶端非常有用。

          一個(gè)常見的mailto鏈接是這樣的:

          這個(gè)鏈接將打開你的電子郵件客戶端,并設(shè)置成撰寫一封主題行為“我需要幫助!”的新電子郵件給“support@service.com”。

          mailto鏈接不一定非要包含電子郵件地址。如果你看一看這篇文章底部的“分享”按鈕,你會(huì)發(fā)現(xiàn)像這樣的一個(gè)mailto鏈接:

          這個(gè)mailto鏈接沒有包含收件人,僅包含了主題行和消息正文。

          既然我們已經(jīng)很好地理解了mailto鏈接是什么樣子的,我們就可以向clean_link函數(shù)添加第一個(gè)驗(yàn)證:

          為了驗(yàn)證mailto鏈接,我們向clean_link中添加了以下代碼:

          • 檢查鏈接是否以mailto:開頭,以識別相關(guān)鏈接。

          • 使用正則表達(dá)式將鏈接分割到它的組件。

          • 從mailto鏈接中刪除實(shí)際的電子郵件地址,并使用Django的EmailValidator驗(yàn)證它。

          注意,我們還添加了一種名為InvalidMarkdown的新異常類型。我們定義了自己的自定義異常類型,以將它與markdown本身所引發(fā)的其他錯(cuò)誤區(qū)分開來。

          自定義錯(cuò)誤類

          我曾經(jīng)寫過關(guān)于自定義錯(cuò)誤類的文章,為什么它們是有用的,以及你什么時(shí)候應(yīng)該使用它們。

          在我們繼續(xù)之前,讓我們添加一些測試,看看它的實(shí)際效果:

          太棒了!按預(yù)期的運(yùn)行了。

          處理內(nèi)部和外部鏈接

          既然我們已經(jīng)了解了mailto鏈接,我們也可以處理其他類型的鏈接:

          外部鏈接

          • 我們的Django應(yīng)用程序外部的鏈接。

          • 必須包含一個(gè)頁面跳轉(zhuǎn)協(xié)議(scheme):http或https。

          • 理想情況下,我們還希望確保這些鏈接沒有被破壞,但我們現(xiàn)在不會(huì)這樣做。

          內(nèi)部鏈接

          • 到我們的Django應(yīng)用程序中的頁面的鏈接。

          • 鏈接必須是相對的:這將允許我們在不同環(huán)境之間移動(dòng)內(nèi)容。

          • 使用Django的URL名稱而不是一個(gè)URL路徑:這將允許我們安全地來回移動(dòng)視圖,而不必?fù)?dān)心markdown內(nèi)容中的失效鏈接。

          • 鏈接可能包含查詢參數(shù)(?)和片段(#)。

          SEO

          從SEO的角度來看,公共URL不應(yīng)該改變。當(dāng)他們這樣做的時(shí)候,你應(yīng)該使用重定向正確地處理它,否則你可能會(huì)受到搜索引擎的懲罰。

          有了這個(gè)需求列表,我們就可以開始工作了。

          解析URL名稱

          要鏈接到內(nèi)部頁面,我們希望編寫者提供一個(gè)URL名稱,而不是URL路徑。例如,假設(shè)我們有這個(gè)視圖:

          這個(gè)頁面的URL路徑是https://example.com/, URL名稱是home。我們想要在我們的markdown鏈接中使用這個(gè)URL名稱home,就像這樣:

          這將渲染到:

          我們還想支持查詢參數(shù)和散列:

          這將渲染到以下HTML:

          在使用URL名稱時(shí),如果我們更改了URL路徑,內(nèi)容中的鏈接將不會(huì)被破壞。要檢查作者提供的href是否是一個(gè)有效的url_name,我們可以嘗試reverse它:

          URL名稱“home”指向URL路徑“/”。當(dāng)沒有匹配項(xiàng)時(shí),將會(huì)引發(fā)一個(gè)異常:

          在我們繼續(xù)之前,當(dāng)URL名稱包含查詢參數(shù)或散列時(shí),會(huì)發(fā)生什么:

          這是有意義的,因?yàn)椴樵儏?shù)和散列不是URL名稱的一部分。

          要使用reverse并支持查詢參數(shù)和散列,我們首先需要清除值。然后,檢查它是一個(gè)有效的URL名稱,并返回包含查詢參數(shù)和散列的URL路徑,如果提供了的話:

          這個(gè)代碼段使用一個(gè)正則表達(dá)式來以?或#的出現(xiàn)對href進(jìn)行分割,并返回各部分。

          請確保它可以工作:

          太了不起了!作者們現(xiàn)在可以在Markdown中使用URL名稱了。它們還可以包括要添加到該URL的查詢參數(shù)和片段。

          處理外部鏈接

          要正確處理外部鏈接,我們需要檢查兩件事:

          1.外部鏈接總是提供一個(gè)跳轉(zhuǎn)協(xié)議,http:或者h(yuǎn)ttps:。

          2.阻止到我們自己網(wǎng)站的絕對鏈接。內(nèi)部鏈接應(yīng)該使用URL名稱。

          到目前為止,我們已經(jīng)處理了URL名稱和mailto鏈接。如果我們通過了這兩個(gè)檢查,這意味著href是一個(gè)URL。讓我們從檢查鏈接是否是鏈接到我們自己的網(wǎng)站開始:

          函數(shù)urlparse會(huì)返回一個(gè)命名元組,該元組包含URL的不同部分。如果netloc屬性等于site_domain,那么該鏈接就確實(shí)是一個(gè)內(nèi)部鏈接。

          如果URL實(shí)際上是內(nèi)部的,我們就需要終止。但是,請記住,作者們不一定是技術(shù)人員,因此我們希望幫助他們,并提供一個(gè)有用的錯(cuò)誤消息。我們要求該內(nèi)部鏈接使用URL名稱而不是URL路徑,所以最好讓作者們知道他們提供的路徑的URL名稱。

          要獲得一個(gè)URL路徑的URL名稱,Django為我們提供了一個(gè)名為resolve的函數(shù):

          當(dāng)找到匹配項(xiàng)時(shí),resolve會(huì)返回一個(gè)ResolverMatch對象,其中包含URL名稱和其他信息。當(dāng)沒有找到匹配項(xiàng)時(shí),它就會(huì)引發(fā)一個(gè)錯(cuò)誤:

          這實(shí)際上就是Django在底層所做的工作,用來確定在一個(gè)新請求到來時(shí)執(zhí)行哪個(gè)視圖函數(shù)。

          為了給作者們提供更好的錯(cuò)誤信息,我們可以使用來自ResolverMatch對象的URL名稱:

          當(dāng)我們識別出內(nèi)部鏈接時(shí),我們要處理兩種情況:

          • 我們沒有識別出這個(gè)URL:這個(gè)URL很可能是不正確的。請作者檢查該URL是否有錯(cuò)誤。

          • 我們識別出了這個(gè)URL: 這個(gè)URL是正確的,所以就告訴作者應(yīng)該使用什么URL名稱。

          我們來實(shí)際地看一下它:

          漂亮!外部鏈接被接受,內(nèi)部鏈接被拒絕,并帶有一個(gè)有用的消息。

          要求跳轉(zhuǎn)協(xié)議

          我們要做的最后一件事是確保外部鏈接包含一個(gè)跳轉(zhuǎn)協(xié)議,要么是http:,要么是https:。讓我們將這最后一部分添加到函數(shù)clean_link:

          使用解析后的URL,我們可以很容易地檢查跳轉(zhuǎn)協(xié)議。讓我們確保它正在工作:

          我們向這個(gè)函數(shù)提供了一個(gè)沒有跳轉(zhuǎn)協(xié)議的鏈接,但是它運(yùn)行失敗了,并顯示了一條有用的消息。太酷了!

          整合代碼

          這是clean_link函數(shù)的全部代碼:

          要了解所有這些特性的一個(gè)實(shí)際用例是什么樣子的,請看下面的內(nèi)容:

          這將產(chǎn)生以下HTML:

          不錯(cuò)!

          結(jié)論

          我們現(xiàn)在有一個(gè)很不錯(cuò)的擴(kuò)展,它可以驗(yàn)證和轉(zhuǎn)換Markdown文檔中的鏈接!現(xiàn)在,在不同環(huán)境之間移動(dòng)文檔和保持內(nèi)容整潔要容易多了,最重要的是,可以保持正確和最新!

          源碼

          你可以在這個(gè)gist中找到全部源代碼。(地址:https://gist.github.com/hakib/73fccc340e855bb65f42197e298c0c7d )

          題外話

          本文中所描述的功能對我們很有用,但是你可能需要根據(jù)自己的需求對它進(jìn)行調(diào)整。

          如果你需要一些想法,那么除了這個(gè)擴(kuò)展之外,我們還創(chuàng)建了一個(gè)markdown Preprocessor,它允許作者們在markdown中使用常量。例如,我們定義了一個(gè)名為SUPPORT_EMAIL的常量,我們像這樣使用它:

          該預(yù)處理程序?qū)⒂梦覀兌x的文本替換字符串$SUPPORT_EMAIL,然后才渲染Markdown。

          英文原文:https://hakibenita.com/django-markdown
          譯者:Nothing

          者:Peter
          來源:Python編程時(shí)光

          在生活和工作中,我們每個(gè)人每天都在和時(shí)間打交道:

        1. 早上什么時(shí)候起床?
        2. 地鐵幾分鐘來一趟?
        3. 中午什么時(shí)候開始午休?
        4. 明天是星期幾?
        5. 距離上次買衣服已經(jīng)2個(gè)月呢?
        6. 領(lǐng)導(dǎo)讓我給代碼加上一個(gè)定時(shí)任務(wù)的功能,怎么辦?
        7. 不同的情況會(huì)遇到不同的時(shí)間問題:具體時(shí)間點(diǎn)、時(shí)間間隔、星期等,無時(shí)不刻我們在和時(shí)間碰撞。本文將利用Python對時(shí)間相關(guān)的類,及其方法與屬性等進(jìn)行詳細(xì)的講解

          1. 時(shí)間戳

          1.1時(shí)間戳簡介

          在正式講解時(shí)間的相關(guān)函數(shù)之前,我們必須先一個(gè)概念:時(shí)間戳。本文中特指unix時(shí)間戳。

          時(shí)間戳Timestamp是指在一連串的數(shù)據(jù)中加入辨識文字,如時(shí)間或者日期等,用以保障本地?cái)?shù)據(jù)更新順序和遠(yuǎn)程的一致。

          unix時(shí)間戳是從1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),不考慮閏秒。1970-01-01就是經(jīng)常我們在MySQL中時(shí)間為空的時(shí)候,轉(zhuǎn)化空的時(shí)間戳之后得到的時(shí)間。一個(gè)小時(shí)表示為UNIX時(shí)間戳格式為:3600秒;一天表示為UNIX時(shí)間戳為86400秒,閏秒不計(jì)算。具體的對照表如下:

          1.2時(shí)間戳轉(zhuǎn)化網(wǎng)站

          下面介紹幾個(gè)時(shí)間戳和具體時(shí)間之間相互轉(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時(shí)間戳在線轉(zhuǎn)換(菜鳥工具):https://c.runoob.com/front-end/852

          5、北京時(shí)間(時(shí)間與時(shí)間戳互換工具):http://www.beijing-time.org/shijianchuo/

          介紹完時(shí)間戳的基本知識,下面重點(diǎn)講解3個(gè)與時(shí)間和日期相關(guān)的Python庫:

        8. calendar
        9. time
        10. datetime
        11. 2.calendar

          calendar的中文意思是"日歷",所以它其實(shí)適合進(jìn)行日期,尤其是以日歷的形式展示。

          2.1模塊內(nèi)容

          下面舉例說明:

          2.2calendar

          我們顯示即將過去2020年的日歷,使用默認(rèn)的參數(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)整個(gè)日歷變寬了,而且星期的英文也是3個(gè)字母來顯示的,解釋一下3個(gè)參數(shù)的含義:

        12. c:每月間隔距離
        13. w:每日寬度間隔
        14. l:每星期行數(shù)
        15. 其中每行長度為:21*w+18+2*c,3個(gè)月一行

          最后,看看即將到來的2021年日歷:

          2.3isleap(year)

          該函數(shù)的作用是判斷某個(gè)年份到底是不是閏年。如果是則返回True,否則返回的是False。

          普通年份能夠被4整除,但是不能被100整除,稱之為普通閏年

          年份是整百數(shù)的,必須能夠被400整除,稱之為世紀(jì)閏年

          2.4leapdays(y1,y2)

          判斷兩個(gè)年份之間有多少個(gè)閏年,包含y1,但是不包含y2,類似Python切片中的包含頭部不包含尾部

          2.5month(year,month,w=2,l=1)

          該函數(shù)返回的是year年的month月的日歷,只有兩行標(biāo)題,一周一行。每日間隔寬度為w個(gè)字符,每行的長度為7*w + 6,其中l(wèi)是每星期的行數(shù)

          首先看看默認(rèn)效果;

          接下來我們改變w和l兩個(gè)參數(shù):

          1、改變w,我們發(fā)現(xiàn)星期的表示變成了3個(gè)字母;同時(shí)每天之間的間隔變寬了(左右間隔)

          2、改變參數(shù)l,我們發(fā)現(xiàn)每個(gè)星期之前的間隔(上下)變寬了

          2.6monthcalendar(year,month)

          通過列表的形式返回year年month月的日歷,列表中還是列表形式。每個(gè)子列表是一個(gè)星期。如果沒有本月的日期則用0表示。每個(gè)子列表都是從星期1開始的,特點(diǎn)概括如下:

        16. 每個(gè)子列表代表的是一個(gè)星期
        17. 從星期一到星期日,沒有出現(xiàn)在本月的日期用0代替
        18. 我們還是以2020年12月份為例:

          和上面的日歷進(jìn)行對比,我們發(fā)現(xiàn):出現(xiàn)0的位置的確是沒有出現(xiàn)在12月份中

          我們再看看2020年3月份的日歷:

          2.7monthrange(year,month)

          該函數(shù)返回的結(jié)果是一個(gè)元組,元組中有兩個(gè)數(shù)值(a,b)

        19. 數(shù)值a代表的是該月從星期幾開始;規(guī)定6代表星期天,取值為0-6
        20. 數(shù)值b代表該月總共有多少天
        21. 通過一個(gè)例子來講解,還是以2020年12月份為例:

          結(jié)果中的1表示12月份從星期2開始(0-6,6代表星期日),該月總共31天

          2.8weekday(y,m,d)

          weekday方法是輸入年月日,我們便可知道這天是星期幾;返回值是0-6,0代表星期1,6代表星期天

          通過一個(gè)例子來講解,以12月12號為例:

          雙12是星期六,返回的結(jié)果是5,5代表的就是星期六,剛好吻合。

          3.time

          time模塊是涉及到時(shí)間功能中最常用的一個(gè)模塊,在Python的相關(guān)時(shí)間需求中經(jīng)常會(huì)用到,下面具體講解該模塊的使用方法。

          3.1模塊內(nèi)容

          先看模塊的整體使用

          3.2time

          time.time()是獲取當(dāng)前的時(shí)間,更加嚴(yán)格地說,是獲取當(dāng)前時(shí)間的時(shí)間戳

          再次理解時(shí)間戳:它是以1970年1月1日0時(shí)0份0秒為計(jì)時(shí)起點(diǎn),計(jì)算到當(dāng)前的時(shí)間長度(不考慮閏秒)

          3.3localtime

          time.localtime打印當(dāng)前的時(shí)間,得到的結(jié)果是時(shí)間元組,具體含義:

          筆記:結(jié)果是時(shí)間元組

          time.localtime的參數(shù)默認(rèn)是time.time()的時(shí)間戳,可以自己輸入某個(gè)時(shí)間戳來獲取其對應(yīng)的時(shí)間

        22. 默認(rèn)當(dāng)前時(shí)間戳
        23. 指定某個(gè)時(shí)間戳
        24. 3.4gmtime

          localtime()得到的是本地時(shí)間,如果需要國際化,使用gmtime(),最好是使用格林威治時(shí)間。

          格林威治標(biāo)準(zhǔn)時(shí)間:位于英國倫敦郊區(qū)的皇家格林威治天文臺的標(biāo)準(zhǔn)時(shí)間,本初子午線經(jīng)過那里。

          3.5asctime

          time.asctime的參數(shù)為空時(shí),默認(rèn)是以time.localtime的值為參數(shù),得到當(dāng)前的日期、時(shí)間、星期;另外,我們也可以自己設(shè)置參數(shù),參數(shù)是時(shí)間元組

        25. 使用當(dāng)前時(shí)間的默認(rèn)時(shí)間元組localtime
        26. 自己指定一個(gè)時(shí)間元組
        27. 獲取當(dāng)前時(shí)間的具體時(shí)間和日期:

          3.6ctime

          ctime的參數(shù)默認(rèn)是時(shí)間戳;如果沒有,也可以指定一個(gè)時(shí)間戳

          3.7mktime

          mktime()也是以時(shí)間元組為參數(shù)的,它返回的是時(shí)間戳,相當(dāng)于是localtime的逆向過程

          3.8strftime

          strftime()是按照我們指定的格式將時(shí)間元組轉(zhuǎn)化為字符串;如果不指定時(shí)間元組,默認(rèn)是當(dāng)前時(shí)間localtime()。常用到的時(shí)間格式見下表:

          我們舉例說明:

        28. 字符串中的分隔符我們可以任意指定
        29. 可以同時(shí)顯示年月日時(shí)分秒等
        30. 3.9strptime

          strptime()是將字符串轉(zhuǎn)化為時(shí)間元組,我們需要特別注意的是,它有兩個(gè)參數(shù):

        31. 待轉(zhuǎn)化的字符串
        32. 時(shí)間字符串對應(yīng)的格式,格式就是上面表中提到的
        33. 4.datetime

          雖然time模塊已經(jīng)能夠解決很多的問題,但是實(shí)際工作和業(yè)務(wù)需求中需要更多的工具,讓我們使用起來更方便和快捷,datetime便是其中一個(gè)很好用的模塊。datetime模塊中幾個(gè)常用的類如下:

        34. date:日期類,常用屬性:year/month/day
        35. time:時(shí)間類,常用屬性:hour/minute/second/microsecond
        36. datetime:日期時(shí)間類
        37. timedelta:時(shí)間間隔,即兩個(gè)時(shí)間點(diǎn)之間的時(shí)間長度
        38. tzinfo:時(shí)區(qū)類
        39. 4.1模塊內(nèi)容



          4.2date

          首先我們引入date類,并創(chuàng)建一個(gè)日期對象:

          1、然后我們可以操作這個(gè)日期對象的各種屬性:后面加上()

          print("當(dāng)前日期:",today)  # 當(dāng)前日期
          print("當(dāng)前日期(字符串):",today.ctime())   # 返回日期的字符串
          print("時(shí)間元組信息:",today.timetuple())   # 當(dāng)前日期的時(shí)間元組信息
          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())   # 返回一個(gè)元組:一年中的第幾周,星期幾
          
          # 結(jié)果顯示
          當(dāng)前日期: 2020-12-25
          當(dāng)前日期(字符串):Fri Dec 25 00:00:00 2020
          時(shí)間元組信息: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類中時(shí)間和時(shí)間戳的轉(zhuǎn)換:

          具體時(shí)間的時(shí)間戳轉(zhuǎn)成日期:

          3、格式化時(shí)間相關(guān),格式參照time模塊中的strftime方法

          from datetime import datetime, date, time
          today = date.today()
          
          print(today)
          # 2020-12-26  默認(rèn)連接符號是-
          
          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)化為具體的時(shí)間
          # 2020/12/26 00:00:00
          

          4、修改日期使用replace方法

          4.3time

          time類也是要生成time對象,包含hour、minute、second、microsecond,我們還是通過例子來學(xué)習(xí):

          from datetime import time
          
          t = time(10,20,30,40)
          print(t.hour)  # 時(shí)分秒
          print(t.minute)
          print(t.second)
          print(t.microsecond)  # 微秒
          
          # 結(jié)果
          10
          20
          30
          40
          

          4.4datetime

          datetime類包含date類和time類的全部信息,下面是類方法相關(guān)的:

          from  datetime import datetime
          
          print(datetime.today())
          print(datetime.now())
          print(datetime.utcnow())# 返回當(dāng)前UTC日期和時(shí)間的datetime對象
          print(datetime.fromtimestamp(1697302830))  # 時(shí)間戳的datetime對象
          print(datetime.fromordinal(699000) )
          print(datetime.combine(date(2020,12,25), time(11,22,54)))  # 拼接日期和時(shí)間
          print(datetime.strptime("2020-12-25","%Y-%m-%d"))
          
          # 結(jié)果
          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
          

          再看看相關(guān)對象和屬性相關(guān):

          from datetime import datetime 
          
          d = datetime(2020,12,25,11,24,23)
          
          print(d.date())
          print(d.time())
          print(d.timetz())  # 從datetime中拆分出具體時(shí)區(qū)屬性的time
          print(d.replace(year=2021,month=1))  # 替換
          print(d.timetuple())  # 時(shí)間元組
          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"))
          
          # 結(jié)果
          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
          

          4.5timedelta

          timedelta對象表示的是一個(gè)時(shí)間段,即兩個(gè)日期date或者日期時(shí)間datetime之間的差;支持參數(shù):weeks、days、hours、minutes、seconds、milliseconds、microseconds


          4.6tzinfo

          本地時(shí)間指的是我們系統(tǒng)本身設(shè)定時(shí)區(qū)的時(shí)間,例如中國處于北京時(shí)間,常說的東八區(qū)UTC+8:00datetime類有一個(gè)時(shí)區(qū)屬性tzinfo

          tzinfo是一個(gè)關(guān)于時(shí)區(qū)信息的類,是一個(gè)抽象的基類,不能直接被實(shí)例化來使用。它的默認(rèn)值是None,無法區(qū)分具體是哪個(gè)時(shí)區(qū),需要我們強(qiáng)制指定一個(gè)之后才能使用。

          因?yàn)楸旧硐到y(tǒng)的時(shí)區(qū)剛好在中國處于東八區(qū),所以上述代碼是能夠正常運(yùn)行的,結(jié)果也是OK的。那如果我們想切換到其他時(shí)區(qū)的時(shí)間,該如何操作呢?這個(gè)時(shí)候我們需要進(jìn)行時(shí)區(qū)的切換。

          1、我們先通過utcnow()獲取到當(dāng)前的UTC時(shí)間

          utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)  # 指定utc時(shí)區(qū)
          print(utc_now)
          
          # 結(jié)果
          2020-12-26 01:36:33.975427+00:00
          

          2、通過astimezone()將時(shí)區(qū)指定為我們想轉(zhuǎn)換的時(shí)區(qū),比如東八區(qū)(北京時(shí)間):

          # 通過astimezone切換到東八區(qū)
          
          beijing = utc_now.astimezone(timezone(timedelta(hours=8)))
          print(beijing)
          
          # 結(jié)果
          2020-12-26 09:36:33.975427+08:00
          

          用同樣的方法切到東九區(qū),東京時(shí)間:

          # UTC時(shí)區(qū)切換到東九區(qū):東京時(shí)間
          
          tokyo = utc_now.astimezone(timezone(timedelta(hours=9)))
          print(tokyo)
          
          # 結(jié)果
          2020-12-26 10:36:33.975427+09:00
          

          還可以直接從北京時(shí)間切換到東京時(shí)間

          # 北京時(shí)間(東八區(qū))直接切換到東京時(shí)間(東九區(qū))
          
          tokyo_new = beijing.astimezone(timezone(timedelta(hours=9)))
          print(tokyo_new)
          
          # 結(jié)果
          2020-12-26 10:36:33.975427+09:00
          


          5.常用時(shí)間轉(zhuǎn)化

          下面介紹幾個(gè)工作中用到的時(shí)間轉(zhuǎn)化小技巧:

          1. 時(shí)間戳轉(zhuǎn)日期
          2. 日期轉(zhuǎn)時(shí)間戳
          3. 格式化時(shí)間
          4. 指定格式獲取當(dāng)前時(shí)間

          5.1時(shí)間戳轉(zhuǎn)成日期

          時(shí)間戳轉(zhuǎn)成具體時(shí)間,我們需要兩個(gè)函數(shù):

        40. time.localtime:將時(shí)間戳轉(zhuǎn)成時(shí)間元組形式
        41. time.strftime:將時(shí)間元組數(shù)據(jù)轉(zhuǎn)成我們需要的形式
        42. import time
          now_timestamp = time.time()  # 獲取當(dāng)前時(shí)間的時(shí)間戳
          
          # 時(shí)間戳先轉(zhuǎn)成時(shí)間元組,strftime在轉(zhuǎn)成指定格式
          now_tuple = time.localtime(now_timestamp)
          time.strftime("%Y/%m/%d %H:%M:%S", now_tuple)
          
          # 結(jié)果
          '2020/12/26 11:19:01'
          

          假設(shè)我們指定一個(gè)具體的時(shí)間戳來進(jìn)行轉(zhuǎn)換:

          import time
          timestamp = 1608852741  # 指定時(shí)間戳
          
          a = time.localtime(timestamp)  # 獲得時(shí)間元組形式數(shù)據(jù)
          print("時(shí)間元組數(shù)據(jù):",a)
          time.strftime("%Y/%m/%d %H:%M:%S", a)  # 格式化
          
          # 結(jié)果
          時(shí)間元組數(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'
          

          如果我們不想指定具體的格式,只想獲取時(shí)間戳對應(yīng)的時(shí)間,直接通過time.ctime即可:

          import time
          time.ctime(1608852741)
          
          # 結(jié)果
          'Fri Dec 25 07:32:21 2020'
          

          5.2日期時(shí)間轉(zhuǎn)成時(shí)間戳

          日期時(shí)間轉(zhuǎn)成時(shí)間戳格式,我們需要使用兩個(gè)方法:

        43. strptime():將時(shí)間轉(zhuǎn)換成時(shí)間數(shù)組
        44. mktime():將時(shí)間數(shù)組轉(zhuǎn)換成時(shí)間戳
        45. 通過具體的案例來學(xué)習(xí)一下:

          date = "2020-12-26 11:45:34"
          
          # 1、時(shí)間字符串轉(zhuǎn)成時(shí)間數(shù)組形式
          date_array = time.strptime(date, "%Y-%m-%d %H:%M:%S")
          
          # 2、查看時(shí)間數(shù)組數(shù)據(jù)
          print("時(shí)間數(shù)組:", date_array)
          
          # 3、mktime時(shí)間數(shù)組轉(zhuǎn)成時(shí)間戳
          time.mktime(date_array)
          
          # 結(jié)果
          時(shí)間數(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
          


          5.3格式化時(shí)間

          工作需求中有時(shí)候給定的時(shí)間格式未必是我們能夠直接使用,所以可能需要進(jìn)行格式的轉(zhuǎn)換,需要使用兩個(gè)方法:

        46. strptime():將時(shí)間轉(zhuǎn)換成時(shí)間數(shù)組
        47. strftime():重新格式化時(shí)間
        48. 通過案例來進(jìn)行學(xué)習(xí):

          import time
          
          old = "2020-12-12 12:28:45"
          
          # 1、轉(zhuǎn)換成時(shí)間數(shù)組
          time_array = time.strptime(old, "%Y-%m-%d %H:%M:%S")
          
          # 2、轉(zhuǎn)換成新的時(shí)間格式(20201212-20:28:54)
          new = time.strftime("%Y%m%d-%H:%M:%S",time_array)  # 指定顯示格式
          
          print("原格式時(shí)間:",old)
          print("新格式時(shí)間:",new)
          
          # 結(jié)果
          原格式時(shí)間: 2020-12-12 12:28:45
          新格式時(shí)間: 20201212-12:28:45
          


          5.4指定格式獲取當(dāng)前時(shí)間

          為了能夠獲取到指定格式的當(dāng)前時(shí)間,我們分為3個(gè)步驟:

        49. time.time():獲取當(dāng)前時(shí)間
        50. time.localtime():轉(zhuǎn)成時(shí)間元組
        51. time.strftime():重新格式化時(shí)間
        52. 通過一個(gè)案例來學(xué)習(xí):

          # 1、時(shí)間戳
          old_time = time.time()
          # 2、時(shí)間元組
          time_array = time.localtime(old_time)
          # 3、指定格式輸出
          new_time = time.strftime("%Y/%m/%d %H:%M:%S", time_array)
          print(new_time)
          
          # 結(jié)果
          2020/12/26 11:56:08
          

          6.總結(jié)

          本文通過各種案例詳細(xì)介紹了Python中關(guān)于時(shí)間輸出和轉(zhuǎn)化的3個(gè)模塊:calendar、time、datetime,最后總結(jié)了4個(gè)工作中常用的時(shí)間轉(zhuǎn)化技巧,希望對大家掌握Python中的時(shí)間輸出和轉(zhuǎn)化有所幫助,不再被時(shí)間困擾。


          主站蜘蛛池模板: 久久久久人妻精品一区三寸| 国产一区二区三区免费| 天堂一区二区三区精品| 日本一区二区高清不卡| 亚洲电影一区二区| 国产成人高清精品一区二区三区| 国语精品一区二区三区| 免费在线观看一区| 韩国资源视频一区二区三区| 日本在线视频一区二区| 久久久久人妻精品一区二区三区| 国产精品无圣光一区二区| 国产精品成人国产乱一区| 国产精品538一区二区在线| 国产精品无码一区二区三区毛片| 亚洲av不卡一区二区三区| 国产精品一区二区av| 中文字幕在线精品视频入口一区| 国产精品主播一区二区| 中文字幕精品一区二区三区视频| 一区二区三区在线| 国产乱码精品一区二区三 | 蜜桃无码AV一区二区| 伊人激情AV一区二区三区| 国精产品一区一区三区| 一区二区乱子伦在线播放| 久久免费国产精品一区二区| 亚洲av日韩综合一区在线观看| 国产AV午夜精品一区二区入口| 久久久久成人精品一区二区| 熟妇人妻AV无码一区二区三区| 一区二区三区四区精品视频| 少妇激情av一区二区| 亚洲乱码av中文一区二区 | 国产品无码一区二区三区在线蜜桃 | 精品久久综合一区二区| 国产一区二区三区亚洲综合 | 亚洲AV无码片一区二区三区| 亚洲一区二区三区日本久久九| 国产精品视频免费一区二区| 国产成人一区二区三区在线|