【Python】datetimeで日付・時刻を扱う方法|strftime・strptime・timedelta

【Python】datetimeで日付・時刻を扱う方法|strftime・strptime・timedelta Python

ログに時刻を記録したり、日付の差を計算したり、「7日後」を求めたりと、プログラムで日付・時刻を扱う場面は多くあります。Pythonでは標準ライブラリのdatetimeモジュールを使います。現在日時の取得、文字列との変換、日付の計算が、これひとつで行えます。

つまずきやすいのは、日時を文字列にするstrftimeと、文字列を日時にするstrptimeの使い分け、そして書式コードの%m(月)と%M(分)の違いです。大文字小文字を間違えると、月のつもりが分になってしまいます。この記事では、実機のPythonで確認しながら、datetimeの使い方を整理します。

先に結論

  • from datetime import datetime, date, timedeltaで読み込みます。
  • 現在日時はdatetime.now()、今日の日付はdate.today()です。
  • 日時→文字列はstrftime("%Y-%m-%d")(f=format)。
  • 文字列→日時はstrptime("2026-06-24", "%Y-%m-%d")(p=parse)。
  • 日付の計算はtimedelta(days=7)を足し引きします。
  • 書式は%mが月、%Mが分。大文字小文字に注意します。

日付を含む文字列の組み立てはf-stringと文字列フォーマット、入力文字列の整形は文字列メソッド、数値との変換は型変換もあわせて参考になります。

スポンサーリンク

現在の日時を取得する now / today

まずは現在の日時の取得です。日付と時刻の両方ならdatetime.now()、日付だけならdate.today()を使います。使う前にdatetimeモジュールから読み込みます。

now.py
from datetime import datetime, date

now = datetime.now()    # 現在の日付と時刻
today = date.today()    # 今日の日付(時刻なし)

print(now)      # 2026-06-24 10:30:45.123456 のような値
print(today)    # 2026-06-24

# 一部だけ取り出す
print(now.year, now.month, now.day)     # 2026 6 24
print(now.hour, now.minute)             # 10 30

datetime.now()は実行した瞬間の日付と時刻、date.today()は今日の日付を返します。取得した値からは、now.yearnow.monthのように、年・月・日・時・分などを個別に取り出せます。

日時を作る・属性を取り出す

特定の日時を自分で作るには、datetime(年, 月, 日, 時, 分, 秒)のように指定します。日付だけならdate(年, 月, 日)です。

create.py
from datetime import datetime, date

dt = datetime(2026, 6, 24, 10, 30, 45)
print(dt)          # 2026-06-24 10:30:45

# 属性で取り出す
print(dt.year)     # 2026
print(dt.month)    # 6
print(dt.day)      # 24
print(dt.hour)     # 10
print(dt.minute)   # 30

# 日付だけ
d = date(2026, 6, 24)
print(d)           # 2026-06-24

実機でも、datetime(2026, 6, 24, 10, 30, 45)からyear=2026、month=6、day=24、hour=10、minute=30が取り出せました。時・分・秒を省略すると0として扱われます。決まった日付どうしの比較や計算をしたいときに、この作り方を使います。

日時を文字列にする strftime

日時を「2026年06月24日」のような好きな形式の文字列にするにはstrftime()を使います。%Y(年)%m(月)%d(日)などの書式コードを組み合わせて指定します。

strftime.py
from datetime import datetime

dt = datetime(2026, 6, 24, 10, 30, 45)

print(dt.strftime("%Y-%m-%d"))            # 2026-06-24
print(dt.strftime("%Y-%m-%d %H:%M:%S"))   # 2026-06-24 10:30:45
print(dt.strftime("%Y年%m月%d日"))        # 2026年06月24日
print(dt.strftime("%H時%M分"))            # 10時30分

実機でも、strftime("%Y-%m-%d %H:%M:%S")2026-06-24 10:30:45という文字列が得られました。strftimeは「string format time」の略で、日時を文字列(string)に整形(format)すると覚えると分かりやすいです。日本語を混ぜた"%Y年%m月%d日"のような形式も自由に作れます。

%m(月)と%M(分)は別物

書式コードでもっとも間違えやすいのが、大文字と小文字の違いです。%mは月、%Mは分を表します。%Hは時、%dは日です。間違えると、月のつもりが分になってしまいます。

mM.py
from datetime import datetime

dt = datetime(2026, 6, 24, 10, 30, 45)

print(dt.strftime("%m"))   # 06 ← 月
print(dt.strftime("%M"))   # 30 ← 分(大文字の M)
print(dt.strftime("%H"))   # 10 ← 時(24時間制)
print(dt.strftime("%d"))   # 24 ← 日
%m は月、%M は分

実機で確認したところ、%m06(月)、%M30(分)になりました。小文字の%mが月、大文字の%Mが分です。「年月日」の%Y-%m-%dのつもりで%Mと書くと、日付のはずが分の値になってしまいます。同様に%H(時・24時間制)、%d(日)も混同しやすいので、慣れるまでは下の書式コード一覧を見ながら書くのが安全です。

文字列を日時にする strptime

逆に、"2026-06-24"のような文字列を日時に変換するにはstrptime()を使います。第1引数に文字列、第2引数に「その文字列がどんな形式か」を書式コードで指定します。

strptime.py
from datetime import datetime

# 文字列 → datetime(形式を第2引数で教える)
dt = datetime.strptime("2026-06-24 10:30", "%Y-%m-%d %H:%M")
print(dt)          # 2026-06-24 10:30:00
print(dt.year)     # 2026(datetimeなので計算や比較ができる)

# 日付だけの文字列
d = datetime.strptime("2026/06/24", "%Y/%m/%d")
print(d.date())    # 2026-06-24
strftime と strptime の覚え方

名前が似ていて混乱しやすいですが、末尾の文字で区別できます。strftimeの「f」は format(整形)で、日時を文字列にします。strptimeの「p」は parse(解析)で、文字列を日時にします。実機でも、strptime("2026-06-24 10:30", "%Y-%m-%d %H:%M")で文字列がdatetime型に変換され、.yearなどが取り出せました。strptimedatetimeに変換しておくと、日付の比較や計算ができるようになります。第2引数の形式が実際の文字列と合っていないとValueErrorになる点に注意します。

日付の計算 timedelta

「7日後」「1時間前」のような日付・時刻の計算にはtimedeltaを使います。datetimetimedeltaを足し引きします。

timedelta.py
from datetime import datetime, timedelta

dt = datetime(2026, 6, 24, 10, 30)

# 7日後
print(dt + timedelta(days=7))      # 2026-07-01 10:30:00

# 1時間前
print(dt - timedelta(hours=1))     # 2026-06-24 09:30:00

# 組み合わせ(3日と12時間後)
print(dt + timedelta(days=3, hours=12))   # 2026-06-27 22:30:00

実機でも、dt + timedelta(days=7)で7日後の2026-07-01dt - timedelta(hours=1)で1時間前の09:30が得られました。timedeltaにはdayshoursminutessecondsweeksを指定できます。ただしmonths(月)やyears(年)は指定できません。月単位の計算が必要なときは、外部ライブラリのdateutilなどを使います。

2つの日付の差を求める

日付どうしを引き算すると、その差がtimedeltaとして得られます。.daysで「何日差か」を取り出せます。日数のカウントに便利です。

diff.py
from datetime import date

d1 = date(2026, 6, 24)
d2 = date(2026, 7, 1)

diff = d2 - d1
print(diff)        # 7 days, 0:00:00
print(diff.days)   # 7(日数を取り出す)

# 今日から特定の日までの残り日数
from datetime import date
target = date(2026, 12, 31)
remaining = (target - date.today()).days
print(f"年末まであと{remaining}日")

実機でも、date(2026,7,1) - date(2026,6,24)7 daysというtimedeltaになり、.days7が取り出せました。「締め切りまであと何日か」「登録から何日経ったか」といった計算は、この引き算と.daysで求められます。

曜日を求める weekday

日付の曜日はweekday()で番号として、strftime("%A")で名前として取得できます。weekday()月曜が0から始まる点に注意します。

weekday.py
from datetime import date

d = date(2026, 6, 24)

# weekday(): 月曜=0, 火曜=1, ... 日曜=6
print(d.weekday())            # 2(水曜日)

# 曜日の名前
print(d.strftime("%A"))       # Wednesday(英語)

# 日本語の曜日にする
week = ["月", "火", "水", "木", "金", "土", "日"]
print(week[d.weekday()] + "曜日")   # 水曜日

実機でも、2026年6月24日のweekday()2(水曜日)になりました。weekday()は月曜が0、日曜が6です。曜日名がほしいときはstrftime("%A")(英語)を使うか、上の例のように曜日のリストを用意してweek[d.weekday()]で日本語に変換します。「土日かどうか」を判定したいときはd.weekday() >= 5で調べられます。

主な書式コード一覧

strftimestrptimeで使う、よく使う書式コードをまとめます。

コード 意味
%Y 年(4桁) 2026
%m 月(2桁) 06
%d 日(2桁) 24
%H 時(24時間制) 10
%M 30
%S 45
%A / %a 曜日(名前 / 短縮) Wednesday / Wed
%p 午前 / 午後 AM / PM

よくある失敗

strftimeとstrptimeを取り違える

日時→文字列がstrftime(format)、文字列→日時がstrptime(parse)です。

%m(月)と%M(分)を間違える

小文字%mが月、大文字%Mが分です。日付には%Y-%m-%dを使います。

timedeltaにmonthsを指定する

timedeltaに月・年は指定できません。daysweeksで計算するか、dateutilを使います。

weekday()を日曜0始まりと思い込む

weekday()は月曜が0です。日曜0始まりがよいならisoweekday()(月曜1〜日曜7)や%wを使います。

strptimeの書式が実際の文字列と合わない

区切りや桁が違うとValueErrorになります。文字列の形に合わせて書式を指定します。

よくある質問

Q現在の日時を取得するには?
Afrom datetime import datetimeと読み込み、datetime.now()で現在の日付と時刻が得られます。日付だけでよいときはfrom datetime import dateとしてdate.today()を使います。
Qstrftimeとstrptimeはどう違いますか?
Astrftimeは日時を文字列に整形(format)し、strptimeは文字列を日時に解析(parse)します。「fはformatで文字列にする」「pはparseで文字列から読む」と覚えると区別しやすいです。どちらも%Y-%m-%dのような書式コードで形式を指定します。
Q%mと%Mの違いは?
A小文字の%mが月、大文字の%Mが分です。日付を表すときは%Y-%m-%d、時刻は%H:%M:%Sと書きます。大文字小文字を間違えると、月のつもりが分の値になってしまうので注意してください。
Q「7日後」や「1時間前」を計算するには?
Atimedeltaを使います。datetime.now() + timedelta(days=7)で7日後、- timedelta(hours=1)で1時間前です。dayshoursminutesweeksを指定できますが、月(months)や年(years)は指定できません。
Q2つの日付の差(日数)を求めるには?
A日付どうしを引き算するとtimedeltaが得られ、.daysで日数を取り出せます。(date(2026,7,1) - date(2026,6,24)).days7になります。締め切りまでの残り日数などに使えます。

まとめ

  • 現在日時はdatetime.now()、今日の日付はdate.today()です。
  • 日時→文字列はstrftime(format)、文字列→日時はstrptime(parse)。
  • 書式は%mが月、%Mが分。大文字小文字に注意します。
  • 日付計算はtimedelta(days=7)を足し引き。月・年は指定できません。
  • 日付の差は引き算して.days、曜日はweekday()(月曜0)です。

datetimeは、現在日時の取得・文字列との変換・日付の計算という3つを押さえれば、日々の処理の大半をこなせます。とくに「strftimestrptimeの向き」と「%m%Mの違い」の2点に注意すれば、日付まわりでよくあるミスを避けられます。