第14章 日付と時間

日付と時間の基本

Pythonのdatetimeモジュールは、日付と時間の操作に関する多くのクラスを提供するもので、プログラミングにおける日時の取り扱いに不可欠なモジュールの一つです。

以下は、datetimeモジュールに含まれる主要なクラスとその機能を紹介します。

date: 年、月、日を表現するためのクラス。

from datetime import date

today = date.today()  # 現在の日付を取得
print(today)  # 例: 2023-07-07


time: 一日の中の時間を表現するためのクラス。時間、分、秒、マイクロ秒を持つ。

from datetime import time

t = time(15, 30)  # 15時30分を表す
print(t)  # 15:30:00


datetime: 日付と時間の組み合わせを表現するためのクラス。

from datetime import datetime

now = datetime.now()  # 現在の日時を取得
print(now)  # 例: 2023-07-07 15:30:00


timedelta: 二つの日時の間の期間や差分を表現するためのクラス。

from datetime import timedelta

delta = timedelta(days=7)
one_week_later = today + delta  # 今日から1週間後の日付を取得
print(one_week_later)


timezone: Python 3.2から追加された、UTCからの固定のオフセットを持つタイムゾーンを表現するクラス。

from datetime import timezone

utc_offset = timezone(timedelta(hours=9))
dt_with_timezone = datetime(2023, 7, 7, tzinfo=utc_offset)
print(dt_with_timezone)


日付と時間の操作

日付や時間の加算、減算

日付や時間の加算、減算はtimedeltaクラスを使用します。以下の例では、現在の日時から3日後と3日前の日時を計算しています。

from datetime import datetime, timedelta

# 現在の日時を取得
now = datetime.now()
print(f"現在: {now}")

# 3日後の日時を計算
three_days_later = now + timedelta(days=3)
print(f"3日後: {three_days_later}")

# 3日前の日時を計算
three_days_ago = now - timedelta(days=3)
print(f"3日前: {three_days_ago}")


タイムデルタを使用した操作

timedeltaは日付や時間の差分を表すクラスです。日、時間、分、秒、マイクロ秒を引数として与えることができます。

from datetime import timedelta

# 2時間30分のタイムデルタを作成
delta = timedelta(hours=2, minutes=30)
print(delta)  # 2:30:00


週の日や月の日を取得する方法

datetimeオブジェクトから曜日や日を取得することができます。曜日はweekday()メソッドを使って取得でき、月曜日が0、日曜日が6として表されます。

date = datetime(2023, 7, 7)  # 2023年7月7日

# 曜日を取得(0:月曜日, 6:日曜日)
day_of_week = date.weekday()
print(f"曜日: {day_of_week}")  # 4, 2023年7月7日は金曜日

# 日を取得
day_of_month = date.day
print(f"日: {day_of_month}")  # 7


日付と時間のフォーマット

Pythonのdatetimeモジュールには、日付や時間を様々なフォーマットで表現するための機能が含まれています。特に、strftimeメソッドとstrptimeメソッドは、日付や時間のフォーマットを扱う上で非常に便利です。


日付や時間のオブジェクトを文字列に変換

strftimeメソッドを使用すると、datetimeオブジェクトを指定したフォーマットの文字列に変換することができます。以下はいくつかの一般的なフォーマットコードの例です。

  • %Y: 4桁の年 (2021, 2022など)
  • %m: 2桁の月 (01, 02,..., 12)
  • %d: 2桁の日 (01, 02,..., 31)
  • %H: 2桁の時間 (00, 01,..., 23)
  • %M: 2桁の分 (00, 01,..., 59)
  • %S: 2桁の秒 (00, 01,..., 59)
from datetime import datetime

now = datetime.now()

# 年-月-日 時:分:秒 の形式で出力
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)  # 例: "2023-07-07 12:34:56"


文字列を日付や時間のオブジェクトに変換

一方、strptimeメソッドは、指定したフォーマットの文字列をdatetimeオブジェクトに変換します。

date_str = "2023-07-07 12:34:56"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed_date)  # 2023-07-07 12:34:56


その他のフォーマットコード/h5>

以下はその他の一般的なフォーマットコードの例です。

  • %a: 曜日の省略形 (Mon, Tue, Wed,...)
  • %A: 曜日のフルネーム (Monday, Tuesday,...)
  • %b: 月の省略形 (Jan, Feb,...)
  • %B: 月のフルネーム (January, February,...)
  • %p: AMまたはPM
  • %f: マイクロ秒 (6桁)


タイムゾーン

Pythonのdatetimeモジュールでは、タイムゾーンを意識した日付や時間の操作が可能ですが、実際のタイムゾーン情報の取り扱いは簡易的です。そこで、より実践的なタイムゾーンの操作やサマータイムの対応、さらには世界各地のタイムゾーンとの互換性を求める場合、pytzというサードパーティーライブラリを用いるのが一般的です。


pytzライブラリ

pytzライブラリは、IANAタイムゾーンデータベースを基にしたPythonのタイムゾーンライブラリです。このライブラリを使用すると、世界中のほぼすべてのタイムゾーンに関する詳細な情報を取得・操作することができます。

import pytz
from datetime import datetime

# Tokyoのタイムゾーンを取得
tokyo_tz = pytz.timezone('Asia/Tokyo')

# 現在のTokyoの時間を取得
tokyo_time = datetime.now(tokyo_tz)
print(tokyo_time)


サマータイムの対応

pytzを使えば、サマータイムが適用される地域においても正確な時刻を取得・操作することができます。

import pytz

# New Yorkのタイムゾーンを取得
ny_tz = pytz.timezone('America/New_York')

# 現在のNew Yorkの時間を取得
ny_time = datetime.now(ny_tz)
print(ny_time)


世界各地のタイムゾーンとの互換性

pytzでは、IANAタイムゾーンデータベースに基づいているため、世界中の多くのタイムゾーンに対応しています。したがって、国際的なアプリケーションやサービスを開発する際には、pytzを使用してタイムゾーンを取り扱うと便利です。

import pytz

# 利用可能なタイムゾーンの一覧を取得
available_timezones = pytz.all_timezones
print(available_timezones)


timeモジュール

Pythonのtimeモジュールは、時間に関連するさまざまな関数を提供するモジュールです。このモジュールを使用すると、UNIXエポックからの経過秒数の取得や待機、時刻のフォーマット変換などの基本的な時間操作を行うことができます。


現在のエポック秒の取得

UNIXエポック(1970年1月1日 00:00:00 UTC)からの経過秒数を取得します。

import time

seconds_since_epoch = time.time()
print(seconds_since_epoch)  # 例:1625369539.482287


プログラムの実行を一時停止

指定された秒数だけプログラムの実行を停止します。小数点以下の秒数も指定できます。

import time

print("Start")
time.sleep(2)  # 2秒間待機
print("End")


ローカルタイムへの変換

エポック秒を、ローカルタイムのstruct_time形式に変換します。

import time

local_time = time.localtime()
print(local_time)
# 例:time.struct_time(tm_year=2021, tm_mon=7, tm_mday=4, ... )


UTCへの変換

エポック秒を、UTCのstruct_time形式に変換します。

import time

utc_time = time.gmtime()
print(utc_time)


時間のフォーマット

struct_timeを、指定したフォーマットの文字列に変換します。

import time

formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
print(formatted_time)  # 例:"2021-07-04 12:32:19"


文字列から時間への変換

時間を表す文字列を、struct_time形式に変換します。

import time

time_string = "2021-07-04 12:32:19"
parsed_time = time.strptime(time_string, "%Y-%m-%d %H:%M:%S")
print(parsed_time)


struct_timeからエポック秒への変換

struct_time形式の時間を、エポック秒に変換します。

import time

seconds = time.mktime(parsed_time)
print(seconds)  # 例:1625369539.0


calendarモジュール

Pythonのcalendarモジュールは、カレンダー関連の操作をサポートするモジュールです。このモジュールを使用することで、特定の月や年のカレンダーをテキストで出力したり、特定の月に含まれる日数を取得したりすることができます。


カレンダーの出力

指定した年のカレンダーをテキストで取得します。

import calendar

print(calendar.calendar(2023))


月のカレンダーを出力

指定した年と月のカレンダーをテキストで取得します。

import calendar

print(calendar.month(2023, 7))


週の最初の曜日を取得/設定

週の最初の曜日(デフォルトは月曜日)を取得または設定します。

import calendar

print(calendar.firstweekday())  # 0: 月曜日
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.firstweekday())  # 6: 日曜日


曜日の取得

指定した年、月、日の曜日を取得します。0が月曜日、6が日曜日を示します。

import calendar

print(calendar.weekday(2023, 7, 7))  # 4: 金曜日


うるう年の確認

指定した年がうるう年かどうかを確認します。

import calendar

print(calendar.isleap(2020))  # True
print(calendar.isleap(2023))  # False


うるう年の数を取得

指定した年間におけるうるう年の数を取得します。

import calendar

print(calendar.leapdays(2000, 2024))  # 6


月の日数と最初の曜日を取得

指定した年と月の最初の曜日(0:月曜日 - 6:日曜日)とその月の日数を取得します。

import calendar

weekday, days_in_month = calendar.monthrange(2023, 2)
print(weekday, days_in_month)  # 2 28


練習問題1.

今日の日付と2022年12月25日との間の日数を計算してください。


練習問題2.

今日から100日後は何曜日になるかを計算してください。


練習問題3.

現在のUTC時間を"YYYY-MM-DD HH:MM:SS"のフォーマットで表示してください。