「今日から3日後の日付を知りたい」
「ある時刻から2時間引いた時刻を計算したい」
このような日時の計算は、プログラムでよく使われます。Pythonでは、datetime
モジュールとtimedelta
クラスを使うことで、このような計算がとても簡単にできます。
この記事では、Pythonで日付や時刻の加算・減算を行う方法を、初心者の方にもわかりやすく解説します。
必要なモジュールを読み込む

最初に、日時を扱うために必要なモジュールを読み込みます。
from datetime import datetime, timedelta
datetime
:日付と時刻を扱うクラスtimedelta
:時間の差分(期間)を表すクラス
現在の日時を取得する
まずは基本として、現在の日時を取得してみましょう。
now = datetime.now()
print(now)
実行結果の例:
2025-06-02 15:30:45.123456
このnow
という変数に現在の日時が入ります。
日時に時間を加算する方法
日数を加算する
今日から1日後(明日)の日時を計算してみます。
tomorrow = now + timedelta(days=1)
print(tomorrow)
実行結果の例:
2025-06-03 15:30:45.123456
時間を加算する
現在の時刻から3時間後を計算します。
three_hours_later = now + timedelta(hours=3)
print(three_hours_later)
実行結果の例:
2025-06-02 18:30:45.123456
分を加算する
10分後の時刻を計算します。
ten_minutes_later = now + timedelta(minutes=10)
print(ten_minutes_later)
複数の単位を同時に加算する
日数、時間、分を組み合わせて計算することもできます。
future_time = now + timedelta(days=2, hours=5, minutes=30)
print(future_time)
この例では、「現在時刻から2日5時間30分後」を計算しています。
timedeltaで使える単位
timedelta
では以下の単位が使えます:
単位 | パラメータ名 | 例 |
---|---|---|
日 | days | timedelta(days=7) |
秒 | seconds | timedelta(seconds=30) |
マイクロ秒 | microseconds | timedelta(microseconds=1000) |
ミリ秒 | milliseconds | timedelta(milliseconds=500) |
分 | minutes | timedelta(minutes=15) |
時間 | hours | timedelta(hours=2) |
週 | weeks | timedelta(weeks=1) |
日時から時間を減算する方法

日数を減算する
今日から1日前(昨日)の日時を計算します。
yesterday = now - timedelta(days=1)
print(yesterday)
時間を減算する
現在の時刻から30分前を計算します。
thirty_minutes_ago = now - timedelta(minutes=30)
print(thirty_minutes_ago)
週を減算する
1週間前の日時を計算します。
last_week = now - timedelta(weeks=1)
print(last_week)
日時の差分を計算する
2つの日時の差を計算することもできます。
基本的な差分計算
start_date = datetime(2025, 6, 1, 10, 0, 0) # 2025年6月1日 10:00:00
end_date = datetime(2025, 6, 5, 15, 30, 0) # 2025年6月5日 15:30:00
difference = end_date - start_date
print(difference)
実行結果:
4 days, 5:30:00
差分の詳細を取得する
print(f"日数: {difference.days}")
print(f"秒数: {difference.seconds}")
print(f"合計秒数: {difference.total_seconds()}")
実行結果:
日数: 4
秒数: 19800
合計秒数: 365400.0
実用的な使用例

有効期限を設定する
パスワードの有効期限を30日後に設定する例:
password_created = datetime.now()
expiry_date = password_created + timedelta(days=30)
print(f"パスワード作成日: {password_created.strftime('%Y-%m-%d')}")
print(f"有効期限: {expiry_date.strftime('%Y-%m-%d')}")
営業時間の計算
営業開始時刻から8時間後の終了時刻を計算:
business_start = datetime(2025, 6, 2, 9, 0, 0) # 9:00
business_end = business_start + timedelta(hours=8)
print(f"営業開始: {business_start.strftime('%H:%M')}")
print(f"営業終了: {business_end.strftime('%H:%M')}")
年齢の計算
生年月日から現在の年齢を計算:
birth_date = datetime(1990, 3, 15)
today = datetime.now()
age_delta = today - birth_date
age_years = age_delta.days // 365
print(f"年齢: 約{age_years}歳")
締切日までの残り日数
deadline = datetime(2025, 7, 1)
today = datetime.now()
remaining = deadline - today
if remaining.days > 0:
print(f"締切まで残り{remaining.days}日")
else:
print("締切を過ぎています")
日時の表示形式を変更する
計算した日時を見やすい形式で表示したいときは、strftime()
メソッドを使います。
future_date = datetime.now() + timedelta(days=7)
# いろいろな形式で表示
print(future_date.strftime("%Y-%m-%d")) # 2025-06-09
print(future_date.strftime("%Y年%m月%d日")) # 2025年06月09日
print(future_date.strftime("%m/%d/%Y")) # 06/09/2025
print(future_date.strftime("%H:%M:%S")) # 15:30:45
よく使う表示形式
形式 | コード | 例 |
---|---|---|
年-月-日 | %Y-%m-%d | 2025-06-02 |
時:分:秒 | %H:%M:%S | 15:30:45 |
月/日/年 | %m/%d/%Y | 06/02/2025 |
曜日 | %A | Monday |
月名 | %B | June |
よくある使い方のパターン

n日後の日付を求める関数
def get_future_date(days):
"""指定した日数後の日付を返す"""
future = datetime.now() + timedelta(days=days)
return future.strftime("%Y-%m-%d")
print(get_future_date(7)) # 7日後
print(get_future_date(30)) # 30日後
期間内かどうかを判定する
def is_within_period(target_date, start_date, end_date):
"""指定した日付が期間内にあるかを判定"""
return start_date <= target_date <= end_date
start = datetime(2025, 6, 1)
end = datetime(2025, 6, 30)
target = datetime(2025, 6, 15)
if is_within_period(target, start, end):
print("期間内です")
else:
print("期間外です")
時間の経過を測定する
import time
start_time = datetime.now()
print("処理開始...")
# 何かの処理(ここでは3秒待機)
time.sleep(3)
end_time = datetime.now()
elapsed = end_time - start_time
print(f"処理時間: {elapsed.total_seconds():.2f}秒")
注意すべきポイント
うるう年の考慮
timedelta
を使った計算では、うるう年も自動的に考慮されます。
# うるう年の2月28日から1日後
leap_year_date = datetime(2024, 2, 28)
next_day = leap_year_date + timedelta(days=1)
print(next_day) # 2024-02-29(うるう日)
月末日の計算
月をまたぐ計算では、月末日の違いに注意が必要です。
# 1月31日から1か月後を計算したい場合
jan_31 = datetime(2025, 1, 31)
# timedelta(days=30) だと3月2日になってしまう
# 正確に1か月後を求めるには別の方法が必要
月単位の計算には、dateutil
ライブラリのrelativedelta
を使うと便利です。
まとめ
Pythonのdatetime
とtimedelta
を使うことで、日時の加算・減算が簡単に行えます。
重要なポイント
- 加算:
datetime + timedelta
- 減算:
datetime - timedelta
- 差分:
datetime - datetime
(結果はtimedelta
) - 表示形式:
strftime()
で自由に変更可能
よく使うパターン
操作 | コード例 |
---|---|
現在日時取得 | datetime.now() |
n日後 | datetime.now() + timedelta(days=n) |
n時間前 | datetime.now() - timedelta(hours=n) |
日付の差分 | date1 - date2 |
見やすい表示 | date.strftime("%Y-%m-%d") |
コメント