ログに時刻を記録したり、日付の差を計算したり、「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モジュールから読み込みます。
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.year・now.monthのように、年・月・日・時・分などを個別に取り出せます。
日時を作る・属性を取り出す
特定の日時を自分で作るには、datetime(年, 月, 日, 時, 分, 秒)のように指定します。日付だけならdate(年, 月, 日)です。
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(日)などの書式コードを組み合わせて指定します。
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は日です。間違えると、月のつもりが分になってしまいます。
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は06(月)、%Mは30(分)になりました。小文字の%mが月、大文字の%Mが分です。「年月日」の%Y-%m-%dのつもりで%Mと書くと、日付のはずが分の値になってしまいます。同様に%H(時・24時間制)、%d(日)も混同しやすいので、慣れるまでは下の書式コード一覧を見ながら書くのが安全です。
文字列を日時にする strptime
逆に、"2026-06-24"のような文字列を日時に変換するにはstrptime()を使います。第1引数に文字列、第2引数に「その文字列がどんな形式か」を書式コードで指定します。
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の「f」は format(整形)で、日時を文字列にします。strptimeの「p」は parse(解析)で、文字列を日時にします。実機でも、strptime("2026-06-24 10:30", "%Y-%m-%d %H:%M")で文字列がdatetime型に変換され、.yearなどが取り出せました。strptimeでdatetimeに変換しておくと、日付の比較や計算ができるようになります。第2引数の形式が実際の文字列と合っていないとValueErrorになる点に注意します。
日付の計算 timedelta
「7日後」「1時間前」のような日付・時刻の計算にはtimedeltaを使います。datetimeにtimedeltaを足し引きします。
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-01、dt - timedelta(hours=1)で1時間前の09:30が得られました。timedeltaにはdays・hours・minutes・seconds・weeksを指定できます。ただしmonths(月)やyears(年)は指定できません。月単位の計算が必要なときは、外部ライブラリのdateutilなどを使います。
2つの日付の差を求める
日付どうしを引き算すると、その差がtimedeltaとして得られます。.daysで「何日差か」を取り出せます。日数のカウントに便利です。
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になり、.daysで7が取り出せました。「締め切りまであと何日か」「登録から何日経ったか」といった計算は、この引き算と.daysで求められます。
曜日を求める weekday
日付の曜日はweekday()で番号として、strftime("%A")で名前として取得できます。weekday()は月曜が0から始まる点に注意します。
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で調べられます。
主な書式コード一覧
strftime・strptimeで使う、よく使う書式コードをまとめます。
| コード | 意味 | 例 |
|---|---|---|
%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に月・年は指定できません。daysやweeksで計算するか、dateutilを使います。
weekday()を日曜0始まりと思い込む
weekday()は月曜が0です。日曜0始まりがよいならisoweekday()(月曜1〜日曜7)や%wを使います。
strptimeの書式が実際の文字列と合わない
区切りや桁が違うとValueErrorになります。文字列の形に合わせて書式を指定します。
よくある質問
from datetime import datetimeと読み込み、datetime.now()で現在の日付と時刻が得られます。日付だけでよいときはfrom datetime import dateとしてdate.today()を使います。strftimeは日時を文字列に整形(format)し、strptimeは文字列を日時に解析(parse)します。「fはformatで文字列にする」「pはparseで文字列から読む」と覚えると区別しやすいです。どちらも%Y-%m-%dのような書式コードで形式を指定します。%mが月、大文字の%Mが分です。日付を表すときは%Y-%m-%d、時刻は%H:%M:%Sと書きます。大文字小文字を間違えると、月のつもりが分の値になってしまうので注意してください。timedeltaを使います。datetime.now() + timedelta(days=7)で7日後、- timedelta(hours=1)で1時間前です。days・hours・minutes・weeksを指定できますが、月(months)や年(years)は指定できません。timedeltaが得られ、.daysで日数を取り出せます。(date(2026,7,1) - date(2026,6,24)).daysは7になります。締め切りまでの残り日数などに使えます。まとめ
- 現在日時は
datetime.now()、今日の日付はdate.today()です。 - 日時→文字列は
strftime(format)、文字列→日時はstrptime(parse)。 - 書式は
%mが月、%Mが分。大文字小文字に注意します。 - 日付計算は
timedelta(days=7)を足し引き。月・年は指定できません。 - 日付の差は引き算して
.days、曜日はweekday()(月曜0)です。
datetimeは、現在日時の取得・文字列との変換・日付の計算という3つを押さえれば、日々の処理の大半をこなせます。とくに「strftimeとstrptimeの向き」と「%mと%Mの違い」の2点に注意すれば、日付まわりでよくあるミスを避けられます。

