結論から言うと、datetime は日付や時刻をPythonで扱うための標準ライブラリです。

実務の自動化では、今日の日付をファイル名に入れたり、期限日までの日数を計算したり、CSVに入っている日付文字列を扱ったりする場面があります。
日付をただの文字列として扱うと、比較や計算がしにくくなります。
この記事では、請求書の期限日を確認する小さな例を使って、datetime の基本を整理します。

この記事でわかること

  • datedatetime の基本的な使い方
  • 文字列と日付を変換する方法
  • 実務の日付計算で気をつけるポイント

完成コード

完成コードは次の通りです。

from datetime import date, datetime, timedelta


def parse_date(value: str) -> date:
    return datetime.strptime(value, "%Y-%m-%d").date()


def create_invoice_status(invoice_no: str, due_date_text: str, today: date) -> str:
    due_date = parse_date(due_date_text)
    remaining_days = (due_date - today).days

    if remaining_days < 0:
        status = "期限切れ"
    elif remaining_days == 0:
        status = "本日期限"
    else:
        status = f"残り{remaining_days}日"

    file_name = f"{today.isoformat()}_{invoice_no}.txt"
    return f"{invoice_no}: {status} / 出力ファイル: {file_name}"


today = date.today()
next_week = today + timedelta(days=7)

print(create_invoice_status("INV-001", today.isoformat(), today))
print(create_invoice_status("INV-002", next_week.isoformat(), today))

このコードを実行すると、今日が期限の請求書と、7日後が期限の請求書について、期限状態と出力ファイル名を表示します。

コードのポイント

このコードでは、日付を文字列のまま扱わず、date に変換してから計算しています。

  • date.today() で今日の日付を取得しています
  • datetime.strptime() で文字列を日付として読み取っています
  • timedelta(days=7) で7日後の日付を作っています
  • 日付同士を引き算して、期限までの日数を計算しています
  • isoformat() でファイル名に使いやすい日付文字列に戻しています

日付処理では、文字列、日付、日時を行き来することがよくあります。
それぞれの役割を分けて考えると、処理が読みやすくなります。

コードを順番に説明します

主要な処理を分けて説明します。

1. 文字列を日付に変換します

def parse_date(value: str) -> date:
    return datetime.strptime(value, "%Y-%m-%d").date()

datetime.strptime() は、文字列を日付や時刻として読み取るための関数です。
ここでは "2026-05-17" のような文字列を、%Y-%m-%d という形式で読み取っています。

strptime() の戻り値は datetime です。
日付だけを使いたいので、最後に .date() を付けて date にしています。

2. 日付同士を引き算します

remaining_days = (due_date - today).days

date 同士は引き算できます。
期限日から今日の日付を引くと、差分を表す値が得られます。
.days を見ると、何日差があるかを整数で取り出せます。

期限日が今日より前なら、差分はマイナスになります。
そのため、マイナスなら期限切れ、ゼロなら本日期限、プラスなら残り日数あり、という判定ができます。

3. timedeltaで未来の日付を作ります

next_week = today + timedelta(days=7)

timedelta は、日数や時間の差を表すためのクラスです。
timedelta(days=7) を今日の日付に足すと、7日後の日付を作れます。

日付に1週間後や30日後を足したい場面では、文字列を自分で組み立てるのではなく、timedelta を使うと安全です。
月末や年末をまたぐ場合も、日付として計算できます。

4. 日付をファイル名に使います

file_name = f"{today.isoformat()}_{invoice_no}.txt"

isoformat() は、日付を "YYYY-MM-DD" 形式の文字列にします。
この形式は並べ替えしやすく、ファイル名にも使いやすい形です。

日付付きのレポートやバックアップファイルを作る場合は、2026-05-17_report.txt のように先頭に日付を入れると、後から探しやすくなります。

実務で使うときのポイント

実務では、日付は文字列のまま扱わず、できるだけ早い段階で datedatetime に変換しておくと処理が安定します。
日付として変換しておけば、比較、並べ替え、差分計算がしやすくなります。

日付だけを扱うなら date、時刻まで扱うなら datetime を使います。
たとえば、請求期限や営業日の日付だけなら date で十分です。
ログの記録時刻や処理開始時刻のように、時間、分、秒まで必要な場合は datetime が向いています。

第6章で扱った pathlib と組み合わせると、日付入りの出力ファイル名を作る処理にも使えます。
ファイル出力やバックアップ処理に日付を入れる場面では、datetime はよく使う標準ライブラリです。

よくある勘違い・注意点

  • 日付文字列は、そのままでは日付計算に向いていません
  • date は日付だけ、datetime は日付と時刻を扱います
  • strptime() の形式指定が文字列と合っていないとエラーになります
  • ファイル名に使う日付は、isoformat() のように並べ替えしやすい形にすると便利です

まとめ

  • datetime は、日付や時刻を扱うための標準ライブラリです
  • 文字列の日付は、strptime() で日付として読み取れます
  • 日付同士の引き算や timedelta を使うと、期限や経過日数を計算できます
  • 実務では、ファイル名、期限管理、ログ記録などでよく使います