AI資格ドリル
資格を選ぶ↓

用語比較

datetimeとtimedeltaの違い|日付同士の引き算が経過日数になる理由(Python3基礎)

date(2003, 12, 2) から date(1964, 7, 31) を引くと、結果は datetime.timedelta(days=14368) です。日付同士の引き算の結果は、日付ではなく、日数の差を表す別の型になります。

datetime(date)は「いつか」を表し、timedelta は「どれだけの差か」を表すと覚えると、演算の結果の型を切り分けられます。

このページは、Python公式チュートリアル10.8「日付と時刻」の記述と、Python 3.9.6での実行結果をもとに比べます。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

datetime・date

datetimeモジュールのクラスで、日付や時刻そのもの(いつか)を表す。

timedelta

2つの日付や時刻の差(どれだけか)を表す。日付同士を引くと得られ、.days で日数を取り出せる。

見分け方

結果が datetime.date(...) の形なら日付、datetime.timedelta(...) の形なら差。

違いを表で確認

比較軸datetime・datetimedelta
表すものdate・datetime:日付や時刻そのもの。例:datetime.date(2003, 12, 2)timedelta:日数・秒数などの差。例:datetime.timedelta(days=14368)
日付同士の引き算 now - birthday の結果date・datetime:引かれる側・引く側として使う(now と birthday はどちらも date)timedelta:結果として得られる。age = now - birthday の age が timedelta で、age.days は 14368
日付に足し算をするときdate + date:TypeError になる(日付どうしは足せない)date + timedelta:日付が得られる。birthday + timedelta(days=14368) は datetime.date(2003, 12, 2)
日と時間をまたぐ差の表し方datetime:datetime(2003, 12, 2, 10) - datetime(2003, 12, 1, 8) の引き算に使うtimedelta:結果は timedelta(days=1, seconds=7200)。時間は秒に換算されて保持される

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

age = now - birthday の age が何の型か分からない人

公式チュートリアルの例では、date 同士の引き算で経過日数が求まります。age は date ではなく timedelta で、age.days で日数を取り出します。

02

日付に日数を足したい人

date に足せるのは timedelta です。date + timedelta(days=14368) は、日付を返します。

03

timedelta(days=1, hours=2) を表示して seconds=7200 と出て戸惑った人

timedelta は日と秒で保持します。1日と2時間は timedelta(days=1, seconds=7200) と表示され、total_seconds() は 93600.0 です。

具体例で使い分ける

例 1

公式チュートリアルの経過日数の例

birthday = dt.date(1964, 7, 31)、now = dt.date(2003, 12, 2) として、age = now - birthday を求めます(Python 3.9.6で実行)。

  • now と birthday はどちらも datetime.date です。
  • 引き算の結果 age は datetime.timedelta(days=14368) で、age.days は 14368 です。

結論: 日付同士の引き算の結果は、timedelta です。

例 2

timedelta を日付に足す

birthday に、上で得た経過日数の timedelta を足します。

  • birthday + timedelta(days=14368) は datetime.date(2003, 12, 2) です。
  • date + date は TypeError(unsupported operand type(s) for +)になります。

結論: 日付に足せるのは、日付ではなく timedelta です。

例 3

選択肢で見分ける場合

「2つの日付の差を表す」という文を、date か timedelta かで判断します。

  • 「差」を表すのは timedelta です。
  • date や datetime は「いつか」を表します。

結論: 「差・経過」とあれば timedelta、「日付・時刻」とあれば date・datetime です。

問題文から答えを選ぶ手順

  1. 1

    問われているものを見る

    「いつか」なら date・datetime、「どれだけか」なら timedelta です。

  2. 2

    演算を見る

    日付 - 日付 は timedelta、日付 + timedelta は日付です。

  3. 3

    結果の表示を見る

    datetime.timedelta(days=...) の形なら差、datetime.date(...) の形なら日付です。

試験での見分け方

  • 1date・datetime は日付や時刻そのものを表す。
  • 2timedelta は2つの日付や時刻の差を表し、日付同士の引き算で得られる。
  • 3日付に足し引きできるのは timedelta で、日付どうしの足し算はできない。

誤答しやすい選択肢

日付同士の引き算の結果も日付だと考える

修正: 結果は timedelta です。age.days のように、日数を取り出して使います。

date + date で日付を進められると考える

修正: TypeError になります。進めるには date + timedelta(days=...) と書きます。

timedelta(days=1, hours=2) が hours を保持すると考える

修正: 日と秒で保持するため、timedelta(days=1, seconds=7200) と表示されます。

確認問題

Q1dt.date(2003, 12, 2) - dt.date(1964, 7, 31) の結果の型は?

答え: timedelta

日付同士の引き算の結果は、日数の差を表す timedelta です。.days は 14368 です。

Q2dt.date(1964, 7, 31) + dt.timedelta(days=14368) の結果は?

答え: datetime.date(2003, 12, 2)

date に timedelta を足すと、日付が得られます。

Q3dt.date(2003, 12, 2) + dt.date(2003, 12, 3) はどうなりますか?

答え: TypeError

日付どうしの足し算は定義されていないため、TypeError になります。

到達チェック

  • date・datetime が「いつか」、timedelta が「差」だと言える
  • 日付 - 日付 の結果が timedelta で、.days で日数を取り出せると言える
  • 日付に足せるのが timedelta だと言える

同じ資格で次に知りたいこと

よくある質問

Qdatetimeとtimedeltaの違いは?

A

date・datetime は日付や時刻そのものを表し、timedelta は2つの日付や時刻の差を表します。日付同士を引くと timedelta が得られます。

Q日付同士の引き算の結果から日数を取り出すには?

A

timedelta の .days を使います。公式チュートリアルの例では、age = now - birthday の age.days が 14368 です。

Q日付に日数を足すには?

A

timedelta を足します。dt.date(1964, 7, 31) + dt.timedelta(days=14368) は datetime.date(2003, 12, 2) です。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)