【実践試験Tips.6】学習のポイント 日付と時刻の処理

こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。

実践試験Tipsは、当協会のPython3エンジニア認定実践試験を受験される予定の方に向けて、何回かに分けてちょっとした情報をお伝えしていく目的で作成しています。

前回は主教材Chapter6 テキスト処理についてお話しました。

Chapter6の次の章Chapter7は試験では出題されませんので解説からは外し、今回はChapter8 日付と時刻の処理についてお話したいと思います。

■学習のポイント:Chapter8 日付と時刻

Python3エンジニア認定実践試験は、主教材「Python実践レシピ」(技術評論社)の中から出題されます。

出題範囲については以下のページをご確認ください。

主教材Chapter8では日付と時刻の処理について解説されています。

日時を扱ううえでは、datetimeを使うことが多くなります。

例えば自動化をするなら日付が扱えた方が便利ですし、今日の日付を使ったフォルダを作る場合でも日付は必要です。また、どれだけの日数が経過しているのか計算することもあるでしょう。

こういった日付が必要になるようなケースは結構ありますので、標準ライブラリのdatetimeは覚えておく必要があります。

この章からの出題数は2問(5%)です。他の章の出題数と比べると、多くはありませんが、日時の処理はPythonを使った開発ではよく行われますので、基本的なことは覚えておきましょう。

なお、出題範囲は8.3までとなりますので、8.4の解説は行いません。

■押さえておきたいポイント

Chapter8の各節で押さえておいてほしいポイントについて簡単に書いておきます。

  • 1節

datetimeライブラリについて紹介されています。datetimeにはいくつかのオブジェクトがありますが、この書籍ではまず日付だけを扱うdateの説明から始まっています。

dateでは年月日を扱えるようになっていますが、年月日が分かるということは曜日も返すことができます。

こうした日付を扱う際の基本的なことが書かれています。また、時間を表すtimeオブジェクトや、日時を扱うdatetimeオブジェクト、日時の差を扱うtimedeltaも紹介されています。

datetimeオブジェクトがこの中でも一番良く利用されているものになるかと思いますが、タイムゾーン付きか、そうでないかという設定の違う2種類があります。タイムゾーンの有無の行き来をすることは可能ですが、使う際にはどちらなのかを意識する必要はあります。これは後ほど3節で補足していきます。

timedeltaオブジェクトではある時を起点にどれだけの時間差があったのかを知りたいときに利用されるオブジェクトです。例えば、datetime同士を引き算するとtimedeltaオブジェクトが返されますし、あらかじめtimedeltaオブジェクトで10時間後という設定をすれば今の日時に10時間を足してくれるというようなことができます。

datetimeライブラリの各オブジェクトについては実際にコードを実行していけば、そう難しいことはなく慣れていくかと思います。

  • 2節

ここでは標準機能のtimeモジュールについて説明されています。

1節のdatetime.time同じtimeのため、混同してしまうことが多く、私自身もたまに間違えます。特にimportする際に、datetimeのtimeと重なってしまうようなことがあると混乱を招きやすくなります。同じtimeという記述でも別の機能として存在しているものになりますので、注意が必要です。

timeモジュールはエポック時間(1970年1月1日の0時00時0分0秒)を起点とした経過時間を扱うものです。エポック時間はコンピュータの世界ではよく利用されるため、このエポック時間を上手く活用するということになります。例えば、エポック時間を使って今の時間との変換を行ったり、経過時間を計測したりというようなときに利用されます。

利用シーン自体は限定的に思えるかもしれませんが、便利なツールではありますので、簡単な使い方程度は覚えておくと良いかと思います。

  • 3節

IANAタイムゾーンデータベースの扱いについて説明されています。この日時と時刻の章の中では一番わかりにくい部分になります。

にもかかわらず、なぜこれが取り上げられているかといえば、日本に住んでいるとあまり時差を意識することが無いためです。日本時間は世界協定時間(UTC)から+9時間で、日本時間で午前9時は世界協定時間では0時になります。

アメリカのように国の中で時差のある国においては、どこのタイムゾーンにおける朝の9時なのかを明確にしておかなければ、いろんなものが分かりにくくなってしまうため、時差を意識したプログラミングをする必要があります。

とはいえ、日本で開発した日本で使用するサービスなのであれば日本時間(JST)でやることが当たり前になりますので、そういったケースでは時差を意識する必要はありません。ただ、時差を意識して開発しなければならないケースというものは当然あります。

私自身は今、時差を意識しなければならないことが多いため、タイムゾーン付きですべてを扱うようにしています。

さて、Pythonにおいて、タイムゾーンを持っているものは「Aware(アウェア)」、持たないものを「Naive(ナイーブ)」と呼びます。

Awareはどこのタイムゾーンに置いての時刻かを正確に表すことができます。一方、Naïveは時間差をとるような相対的なものだけを把握できれば問題ないようなケースで利用されます。

Awareなdatetimeオブジェクトであれば別の地域の時差を正確に計算してイコールになる時間を内部で計算して出してくれます。(例:日本時間9時/UTC+9時間=ヨーロッパ中央時間1時/UTC+1時間)

なお、Python3においてはこのAwareとNaiveを引き算して時間差を計算したり、時差を考慮せずに同じ時間であるのかということを計算することはできなくなっています。つまり、時差があるものとないものでは比較することができないということです。

そのため、なるべくAwareでdatetimeを扱えるようになっておくことは重要になっています。

Python3.9から搭載されたZoneInfoモジュールでは、便利なデータベースを保有しており、ZoneInfo(“Asia/Tokyo”)と指定すると日本時間に設定してくれるようになっています。以前であれば対象地域の時差を把握した上でUTC+9などいろいろな指定をする必要がありましたが、このZoneInfoモジュールの持つデータベースによってそれを把握していなくても良くなっています。

時差問題はとてもわかりにくいところがありますが、Pythonにおいてはデータベースの整備や考え方がしっかり捉えられ、歴史的なことも考慮されて実装されています。

■まとめ:日付と時刻の取り扱い

datetimeにおいては普段のdatetimeの使い方だけでなく、date、time、datetime、timedelta、timeモジュールを含めた使い方を知っておきましょう。また、タイムゾーンを意識したプログラミングを心掛けておくことが重要なキーになってくるかと思います。

タイムゾーンの取り扱いに慣れていない人にとっては、ややこしいかとは思いますが、慣れていくことが大切です。いろいろ試してもらえればと思います。

更新情報

PAGE TOP