[譯] Python 中如何格式化日期

0x7e2發表於2018-11-07

介紹

Python 附帶了各種有用的物件,可以直接使用。例如日期物件就是一個例子。由於日期和時間的複雜性,日期型別很難從頭開始操作。所幸,Python 日期物件將日期轉換成所需的字串格式變得相當容易。

日期格式化是作為程式設計師的你最重要的任務之一。不同地區表示日期/時間的方法各不相同,因此你作為程式設計師的一大目標是以使用者可讀的方式顯示日期值。

例如,你可能需要用數字格式表示日期值,如 “02-23-2018”。另一方面,你可能需要以更長的文字格式(如 “Feb 23,2018“)表示相同的日期。在另一種情況下,你可能希望從數字格式的日期值中提取出字串格式的月份。

在本文中,我們將研究不同型別的日期物件及其功能。

datetime 模組

正如你猜到的, Python 的 datetime 模組包含可用於處理日期和時間值的方法。要使用這個模組,我們得先通過以下 import 語句將其匯入:

import datetime
複製程式碼

我們可以使用 time 類表示時間值。時間類的屬性包括小時、分鐘、秒和微秒。

time 類的引數是可選的。儘管不指定任何引數,你將獲得 0 的時間(物件),但這大多數時候不太可能是你需要的。

例如,要初始化值為 1 小時、10 分種、20 秒、13 微秒的時間物件,我們可以執行以下命令:

t = datetime.time(1, 10, 20, 13)
複製程式碼

讓我們使用 print 功能來檢視時間:

print(t)
複製程式碼

輸出:

01:10:20.000013
複製程式碼

你可能只需要檢視小時、分鐘、秒或者微秒,您可以像下邊這麼做:

print('hour:', t.hour)
複製程式碼

輸出:

hour: 1
複製程式碼

可以按照如下方式檢索上述時間(物件)的分鐘、秒或者微秒:

print('Minutes:', t.minute)
print('Seconds:', t.second)
print('Microsecond:', t.microsecond)
複製程式碼

輸出:

Minutes: 10
Seconds: 20
Microseconds: 13
複製程式碼

日曆日期指可以通過 date 類表示。示例具有的屬性有年、月和日。

讓我們來呼叫 today 方法來檢視今天的日期:

import datetime

today = datetime.date.today()
print(today)
複製程式碼

輸出:

2018-09-15
複製程式碼

程式碼將返回今天的日期,因此你看到的輸出取決於你執行指令碼的日期。

現在我們呼叫 ctime 方法以另一種格式列印日期:

print('ctime:', today.ctime())
複製程式碼

輸出:

ctime: Sat Sep 15 00:00:00 2018
複製程式碼

ctime 方法會使用比我們之前看到的示例更長的日期時間格式。此方法主要用於將 Unix 時間(從 1970 年 1 月 1 日以來的秒數)轉換為字串格式。

以下是我們如何使用 date 類顯示年份,月份和日期:

print('Year:', today.year)
print('Month:', today.month)
print('Day :', today.day)
複製程式碼

輸出

Year: 2018

Month: 9
Day : 15
複製程式碼

使用 strftime 將日期轉換為字串

既然你已經知道如何建立時間和日期物件,那麼讓我們學習如何將它們格式化為更易讀的字串。

為此,我們將使用 strftime 方法。這個方法可以幫助我們將日期物件轉換為可讀字串。它需要兩個引數,語法如下所示:

time.strftime(format, t)
複製程式碼

第一個引數是格式字串(以何種格式顯示時間日期,感謝 rocheers 提醒),第二個引數是格式化的時間,可選值。

這個方法也可以在 datetime 物件上直接呼叫。如以下示例所示:

import datetime

x = datetime.datetime(2018, 9, 15)

print(x.strftime("%b %d %Y %H:%M:%S"))
複製程式碼

輸出:

Sep 15 2018 00:00:00
複製程式碼

我們使用以下字串來格式化日期:

  • %b: 返回月份名稱的前三個字元。在我們的例子中,它返回 ”Sep“
  • %d: 返回本月的日期,從 1 到 31。在我們的例子中, 它返回 "15"。
  • %Y: 返回四位數格式的年份。在我們的例子中, 它返回 "2018"。
  • %H: 返回小時。在我們的例子中, 它返回 "00"。
  • %M: 返回分鐘,從 00 到 59。在我們的例子中, 它返回 "00"。
  • %S: 返回秒,從 00 到 59。在我們的例子中, 它返回 "00"。

我們沒有時間(物件),因此時間值都是 ”00“。下面的例子顯示瞭如何格式化時間:

import datetime

x = datetime.datetime(2018, 9, 15, 12, 45, 35)

print(x.strftime("%b %d %Y %H:%M:%S"))
複製程式碼

輸出:

Sep 15 2018 12:45:35
複製程式碼

完整的字元程式碼列表

除了上面給出的字串外,strftime 方法還使用了其他幾個指令來格式化日期值:

  • %a: 返回工作日的前三個字元,例如 Wed。
  • %A: 返回返回工作日的全名,例如 Wednesday。
  • %B: 返回月份的全名,例如 September。
  • %w: 返回工作日作為數字,從 0 到 6,週日為 0。
  • %m: 將月份作為數字返回,從 01 到 12。
  • %p: 返回 AM/PM 標識。
  • %y: 返回兩位數格式的年份,例如,”18“ 而不是 ”2018“。
  • %f: 返回從 000000 到 999999 的微秒。
  • %Z: 返回時區。
  • %z: 返回 UTC 偏移量。
  • %j: 返回當年的日期編號,從 001 到 366。
  • %W: 返回年份的週數,從 00 到 53。星期一被記為一週第一天。
  • %U: 返回年份的週數,從 00 到 53。星期日被記為一週第一天。
  • %c: 返回本地日期和時間版本。
  • %x: 返回本地日期版本。
  • %X: 返回本地時間版本。

譯者備註:原文中的是 weekday,在查了一些資料後翻譯成 “工作日”,但是考慮以下示例:

from datetime import datetime
x  = datetime.now()
x.strftime("%A")
複製程式碼

輸出:

'Sunday'
複製程式碼

請考慮以下示例:

import datetime

x = datetime.datetime(2018, 9, 15)

print(x.strftime('%b/%d/%Y'))
複製程式碼

輸出:

Sep/15/2018
複製程式碼

以下是你只獲取月份的方法:

print(x.strftime('%B'))
複製程式碼

輸出:

September
複製程式碼

讓我們只展示年份:

print(x.strftime('%Y'))
複製程式碼

輸出:

2018
複製程式碼

在這個例子中,我們使用了格式化程式碼 %Y。請注意,它的 Y 是大寫的,現在使用小寫寫:

print(x.strftime('%y'))
複製程式碼

輸出:

18 
複製程式碼

這次省略了年份中前兩位數字。如你所見,使用這些格式化程式碼,你可以用你想要的任何方式表示日期時間。

使用 strptime 將字串轉換成日期

strftime 方法幫助我們將日期物件轉換為可讀的字串,strptime 恰恰相反。它作用於字串,並將它們轉換成 Python 可以理解的日期物件。

這是這個方法的語法:

datetime.strptime(string, format)
複製程式碼

string 引數是我們轉換成日期格式的字串值。format 引數是指定轉換後日期採用的格式的指令。

例如,如果我們需要將字串 “9/15/18” 轉換成 datetime 物件。

我們先匯入 datetime 模組,我們將使用 from 關鍵字以便能夠在沒有點格式的情況下引用模組中特定的函式:

from datetime import datetime
複製程式碼

然後我們可以用字串形式定義日期:

str = '9/15/18'
複製程式碼

在將字串轉換為實際的 datetime 物件之前, Python 無法將上述字串理解為日期時間。我們可以通過呼叫 strptime 方法成功完成:

執行以下命令轉換字串:

date_object = datetime.strptime(str, '%m/%d/%y')
複製程式碼

現在讓我們呼叫 print 函式用 datetime 格式顯示字串:

print(date_object)
複製程式碼

輸出:

2018-09-15 00:00:00
複製程式碼

如你所見,轉換成功!

你可以看到正斜槓 “/” 用於分隔字串的各個元素。這告訴 strptime 方法我們的日期是什麼格式,我們的例子中是用 "/" 作為分隔符。

但是,如果月/日/年被 “-” 分隔怎麼辦?你應該這麼處理:

from datetime import datetime

str = '9-15-18'
date_object = datetime.strptime(str, '%m-%d-%y')

print(date_object)
複製程式碼

輸出:

2018-09-15 00:00:00
複製程式碼

再一次,多虧了格式說明符,strptime 方法能夠解析我們的日期並將其轉換為日期物件。

結論

在本文中,我們研究瞭如何在 Python 中格式化日期。我們看到 Python 中的 datetime 模組如何操作日期和時間值。該模組包含了許多操作日期時間的類,比如,time 類用於表示時間值,而 date 類用來表示日曆日期值。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章