【Python入門】日期與字串相互轉換的方法|strptime・strftime的使用徹底解說

目次

1. 在使用 Python 處理日期和字串之前應了解的基礎知識

在 Python 中處理日期或時間時,最基本的便是「datetime 模組」。本文將詳細說明日期與字串的相互轉換方法,但在那之前,先來整理一下應了解的基本概念與類別吧。

Python 的標準函式庫 datetime 是什麼?

Python 提供了 datetime 模組作為處理日期與時間的標準函式庫。其特點是不需要額外安裝,即可立即使用。透過此模組,可以進行取得目前時刻、日期的加減、格式轉換、比較等廣泛的操作。 首先,讓我們確認基本的匯入方法。
import datetime
或者,也可以像下面這樣只匯入必要的類別。
from datetime import datetime, date, time, timedelta

常用類別及其差異

datetime 模組中存在多個類別,但與日期和字串轉換關係最密切的主要是以下三個。

datetime.date 類別

表示「年・月・日」資訊的類別。不包含時間。
d = datetime.date(2025, 4, 7)
print(d)  # 輸出: 2025-04-07

datetime.time 類別

僅持有「時・分・秒」等時間相關資訊的類別。不包含日期。
t = datetime.time(14, 30, 0)
print(t)  # 輸出: 14:30:00

datetime.datetime 類別

能夠處理日期(年・月・日)和時間(時・分・秒)的、最通用的類別。
dt = datetime.datetime(2025, 4, 7, 14, 30)
print(dt)  # 輸出: 2025-04-07 14:30:00
此類別在字串與日期的相互轉換中最常被使用。

使用 datetime.now() 取得目前日期時間

使用 datetime.datetime 類別 的 now() 方法,即可輕鬆取得目前的日期時間。
from datetime import datetime

now = datetime.now()
print(now)  # 範例: 2025-04-07 13:45:12.345678
像這樣取得的 datetime 物件,可以使用稍後介紹的 strftime()strptime() 來轉換成字串,或從字串生成。

總結

本節中,說明了在 Python 處理日期與時間時最基本的 datetime 模組的概要,以及代表性類別的差異。下一節將聚焦於「從字串轉換到日期」,介紹 strptime() 的具體用法。

2. 【字串 → 日期】使用strptime()建立日期物件的方法

在 Python 中,為了將表示日期的字串轉換為datetime物件,我們使用名為strptime()的方法。這是「string parse time」的縮寫,是一種解析字串並使其被識別為日期的函式。 本章將依序說明從基本用法、對應中文表示法的方法,到錯誤的處理方式。

strptime()的基本用法與格式指定子一覽

基本構文

from datetime import datetime

 date_string = '2025-04-07'
 dt = datetime.strptime(date_string, '%Y-%m-%d')
 print(dt)  # 輸出: 2025-04-07 00:00:00
strptime()會接受以下兩種引數:
  • 第一引數:解析對象的字串(例: ‘2025-04-07’)
  • 第二引數:該字串的格式(例: ‘%Y-%m-%d’)

常用格式指定子

指定子意義範例
%Y西元年(4 位)2025
%y西元年(2 位)25
%m月(2 位)04
%d日(2 位)07
%H小時(24 小時制)14
%M分鐘30
%S59
%A星期(英文)Monday
%p上午/下午(AM/PM)AM

另一個範例:包含日期時間的轉換

date_string = '2025-04-07 14:30:00'
 dt = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
 print(dt)  # 輸出: 2025-04-07 14:30:00

如何處理中文表示的日期字串?

在中文中常見的「2025年4月7日」或「2025年04月07日(一)」等格式的處理,需要像以下這樣巧妙設計格式。

解析包含年月日中文的字串範例

date_string = '2025年4月7日'
 dt = datetime.strptime(date_string, '%Y年%m月%d日')
 print(dt)  # 輸出: 2025-04-07 00:00:00

包含中文星期的字串,基本的strptime()無法對應

例如「2025年4月7日(一)」這樣的字串,單獨使用strptime()會發生錯誤。這是因為 Python 的strptime()依賴地區設定,且中文的星期標準上不支援。 在這種情況下,有以下的對應方法:
  • 從字串中移除不需要的中文星期部分後,再傳給strptime()
  • 活用外部程式庫(例:kanji_to_time 等)

常見錯誤及其處理方法:ValueError

使用strptime()時最常遇到的,是以下這樣的錯誤。
ValueError: time data '2025/04/07' does not match format '%Y-%m-%d'

此錯誤的原因是?

這是因為字串的實際形式與指定的格式不一致而發生的。 例如,如果要處理 '2025/04/07' 這樣的日期,則需要像下面這樣,將格式也調整為斜線。
date_string = '2025/04/07'
 dt = datetime.strptime(date_string, '%Y/%m/%d')

疑難排解的要點

  • 確認分隔符號(-、/、空白等)
  • 是否補零(例: ’04’ vs ‘4’)
  • 是否包含星期等、strptime()無法處理的多餘資訊
侍エンジニア塾

3. 【日期 → 字串】使用strftime()自由格式轉換的方法

在 Python 中處理日期時,將 datetime 物件轉換為特定格式的字串的情況非常多。此時方便的就是 strftime() 方法。 本章將說明 strftime() 的基本用法、常用格式指定子,以及顯示中文的星期名稱的方法。

strftime() 的基本用法

語法與簡單使用範例

from datetime import datetime

 dt = datetime(2025, 4, 7, 14, 30)
 formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
 print(formatted)  # 輸出: 2025-04-07 14:30:00
strftime() 是「string format time」的縮寫,將 datetime 物件轉換為指定的格式字串。

常用格式指定子(重列)

格式碼含義範例
%Y西元(4位)2025
%m月份(2位)04
%d日期(2位)07
%H小時(24小時制)14
%M分鐘30
%S00
%A星期(英文)Monday
%a星期(縮寫)Mon
%p上午/下午(AM/PM)PM

實用範例:自由自訂格式

以斜線分隔顯示年月日

dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y/%m/%d')
print(formatted)  # 輸出: 2025/04/07

轉換為年月日格式

dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日')
print(formatted)  # 輸出: 2025年04月07日

包含時間的詳細顯示

dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y年%m月%d日 %H時%M分')
print(formatted)  # 輸出: 2025年04月07日 14時30分

想要顯示中文的星期名稱時

strftime('%A') 可以顯示星期,但預設是英文表示。如果想要顯示中文,則需要變更地區設定(語言設定)。

使用 locale 模組的範例(適用於 UNIX/Linux 環境)

import locale
from datetime import datetime

locale.setlocale(locale.LC_TIME, 'zh_TW.UTF-8')
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日(%A)')
print(formatted)  # 輸出: 2025年04月07日(星期一)

注意事項

  • Windows 環境中 'zh_TW.UTF-8' 可能無法使用。
  • 由於依賴環境,在 Web 應用程式或散布程式碼中應避免硬編碼。
  • 如果重視穩定性,也可以自己使用字典映射星期名稱。
weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
weekday = weekdays[dt.weekday()]
print(f"{dt.strftime('%Y年%m月%d日')}({weekday})")

總結

本章介紹了將 datetime 物件轉換為字串的方法,即 strftime() 的用法與實際範例。能夠自由自訂輸出格式的特性,在日期資料的可視化或記錄輸出等各種場合都非常有用。 下一章將說明與標準化日期格式「ISO 8601 格式」的相互轉換。

4. ISO 8601格式的互換轉換技巧

在系統間資料聯動或API通訊等情況下,以「ISO 8601格式」交換日期時間是很常見的。Python中,此格式的轉換也是非常重要的操作之一。 本章將說明Python中ISO 8601格式的互換轉換方法,以及處理含時區資訊的字串方式。

ISO 8601格式是什麼?

ISO 8601格式是「國際標準化組織(ISO)」所制定的日期與時間表示規則。其形式如下所示:
2025-04-07T14:30:00
  • 日期與時間之間夾以 “T”
  • 24小時表示法
  • 有時會附加時區資訊(例如:+09:00Z
此格式廣泛用於JSON或XML等資料格式、REST API、記錄檔等。

isoformat()將日期 → 轉換為ISO格式的字串

Python的datetime物件中,備有isoformat()這種便利的方法。

使用範例

from datetime import datetime


dt = datetime(2025, 4, 7, 14, 30)
iso_str = dt.isoformat()
print(iso_str)  # 輸出: 2025-04-07T14:30:00

可透過引數微調

# 顯示到毫秒
print(dt.isoformat(timespec='milliseconds'))  # 2025-04-07T14:30:00.000

# 只取得日期
print(dt.date().isoformat())  # 2025-04-07

fromisoformat()將ISO格式 → 轉換為datetime物件

相反地,要從ISO 8601格式的字串產生datetime物件,則使用fromisoformat()

使用範例

iso_str = '2025-04-07T14:30:00'
dt = datetime.fromisoformat(iso_str)
print(dt)  # 輸出: 2025-04-07 14:30:00
這非常直觀,且Python 3.7以降即支援。

對應含時區資訊的ISO字串的方法

標準的fromisoformat()在包含時區資訊(例如:+09:00Z)時,有時無法順利處理。此類情況下,使用第三方程式庫可更靈活地應對。

推薦程式庫:dateutil.parser

pip install python-dateutil

使用範例

from dateutil import parser


iso_str = '2025-04-07T14:30:00+09:00'
dt = parser.parse(iso_str)
print(dt)  # 輸出: 2025-04-07 14:30:00+09:00
如此,即可正確解析含時區的ISO字串。

補充:UTC與Z表示法的差異

  • Z是「Zulu Time(UTC)」的縮寫。
  • 2025-04-07T14:30:00Z 表示UTC(協定世界時)的時間。
Python標準的fromisoformat()不支援Z表示法,因此仍推薦使用dateutil.parser

總結

ISO 8601格式是日期與時間資料交換中不可或缺的存在。Python中,可使用isoformat()fromisoformat()輕鬆進行轉換,但處理含時區的字串時,使用外部程式庫dateutil非常有效。 下一章將介紹日期的計算、比較、差分求取等,在實務中實用的進階技巧。
年収訴求

5. 處理日期時知道這些技巧會很方便的技巧集

在處理日期或時間時,不僅僅是轉換格式,日期之間的比較日期的加減等處理也很常用。 本章將以datetime模組中實務上實用的技巧為中心進行說明。

timedelta用來加減日期

如果想計算日期的「1天後」「1週前」「30天後」等,可以使用datetime.timedelta類別。

求取1天後・1天前的日期

from datetime import datetime, timedelta


today = datetime(2025, 4, 7)
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)

print(tomorrow)   # 輸出: 2025-04-08 00:00:00
print(yesterday)  # 輸出: 2025-04-06 00:00:00

也可以以時間單位進行加減

dt = datetime(2025, 4, 7, 14, 30)
plus_2_hours = dt + timedelta(hours=2)

print(plus_2_hours)  # 輸出: 2025-04-07 16:30:00

取得今天・昨天・明天的日期

以現在時間為基礎,取得相對日期的模式也非常常見。
from datetime import datetime, timedelta

now = datetime.now()
today = now.date()
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)

print(f"今天: {today}")
print(f"昨天: {yesterday}")
print(f"明天: {tomorrow}")
藉此,就可以輕鬆實作日報或排程器等功能。

日期的比較與差分(天數)的計算

也可以計算兩個日期的前後關係,或差分(天數・時間等)。

日期的比較(大小關係)

d1 = datetime(2025, 4, 7)
d2 = datetime(2025, 4, 10)

print(d1 < d2)  # 輸出: True

求取差分(timedelta的活用)

delta = d2 - d1
print(delta.days)  # 輸出: 3
如此一來,差分會以timedelta物件的形式取得,可以透過其中的.days.seconds屬性來細部分別取得。

取得・判斷特定曜日的辦法

要從日期取得星期,或判斷是否為特定星期,可以使用.weekday().isoweekday()
方法輸出(例:星期一)
.weekday()0(=星期一)
.isoweekday()1(=星期一)
d = datetime(2025, 4, 7)  # 星期一

print(d.weekday())     # 輸出: 0
print(d.isoweekday())  # 輸出: 1

以日文顯示星期的方法(使用字典映射)

weekdays = ['月', '火', '水', '木', '金', '土', '日']
weekday_jp = weekdays[d.weekday()]
print(f"{d.strftime('%Y/%m/%d')}({weekday_jp})")

閏年的判斷・月末的自動計算(補充)

import calendar

# 判斷是否為閏年
print(calendar.isleap(2024))  # 輸出: True

# 取得月末的日期
last_day = calendar.monthrange(2025, 4)[1]
print(last_day)  # 輸出: 30

總結

本章介紹了實務上常見的日期加減、比較、差分的計算方法,以及曜日的判斷等。特別是活用timedelta的處理,具有非常高的通用性,是日期處理的基礎技能,值得牢記。 下一章將彙整與至今說明內容相關的常見問題(FAQ),提供有助於解答疑問的資訊。

6. 常見問題(FAQ)

在 Python 中處理日期與字串時,特別是初學者容易碰到的難點,我們以常見問題的形式彙整。請用來解決疑難或強化理解。

Q1. strptime() 為什麼會出現 ValueError

A. 很可能格式不匹配。

strptime() 中,字串與指定的格式即使只差一個字元也會出錯範例:NG 的情況
from datetime import datetime

 date_string = '2025/04/07'
# 格式設定為「-」而導致不匹配
 dt = datetime.strptime(date_string, '%Y-%m-%d')
# → ValueError 發生
修正範例:
dt = datetime.strptime(date_string, '%Y/%m/%d')
另外,還可能有以下原因:
  • 是否有零填充(例如 04 和 4)
  • 多餘的字元(例如:星期或空格)
  • 不支援的格式(日文的「上午・下午」等)

Q2. 為什麼不會顯示日文的星期,而是顯示英文?

A. strftime('%A') 依賴於地區設定(語言設定)

Python 的標準設定使用英文,因此 %A 取得的星期會是 Monday 等。

解決方案1:使用 locale 模組(UNIX/Linux 系統)

import locale
 from datetime import datetime

 locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
 dt = datetime(2025, 4, 7)
 print(dt.strftime('%A'))  # 輸出: 星期一

解決方案2:使用字典將星期對應到日文(不依賴環境)

weekdays = ['月', '火', '水', '木', '金', '土', '日']
 print(weekdays[dt.weekday()])  # 輸出: 月

Q3. 可以轉換包含「上午」「下午」的日文日期嗎?

A. Python 標準的 strptime() 不支援。

例如 '2025年4月7日 下午2時30分' 這類字串,在標準的 strptime() 中會出錯。

對應方法:

  • 自行使用正規表達式等將「上午/下午」轉換為時間
  • 使用外部函式庫(例如:dateparser
pip install dateparser
import dateparser

 s = '2025年4月7日 下午2時30分'
 dt = dateparser.parse(s)
 print(dt)  # 輸出: 2025-04-07 14:30:00

Q4. datetime.now()datetime.today() 的差別是什麼?

A. 實質上相同(在 datetime.datetime 中)。

from datetime import datetime

 print(datetime.now())     # 取得目前的日期時間
 print(datetime.today())   # 同樣取得目前的日期時間
兩者都返回目前的本地時間。嚴格的差別在 Python 文件中有記載,但在一般用途中視為相同行為沒有問題。

Q5. 無法轉換帶有時區的 ISO 字串。該怎麼辦?

A. datetime.fromisoformat() 不支援某些帶有時區的字串。

例如:2025-04-07T14:30:00+09:00

解決方案:使用 dateutil.parser.parse()

from dateutil import parser

 s = '2025-04-07T14:30:00+09:00'
 dt = parser.parse(s)
 print(dt)  # 輸出: 2025-04-07 14:30:00+09:00
使用 dateutil 函式庫,即可靈活處理帶有時區的字串。

補充:如果在 Windows 上日文地區設定無法正常運作?

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8') 無法通過時,Windows 的地區設定名稱會是 Japanese_Japan.932 之類。
locale.setlocale(locale.LC_TIME, 'Japanese_Japan.932')
不過,由於環境差異,使用字典對應更為可靠。

總結

在 FAQ 中,我們以具體範例說明了常見錯誤和容易混淆的點。如果能解決這些疑問,應該能對 Python 中的日期與字串處理更有自信。
侍エンジニア塾