親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

日時の取得・処理

Pythonで日時(日付と時刻)を取得、処理する(変更する、比較する)方法を説明します。いくつかある方法のうち、ここではdatetimeというモジュールを使います。モジュールというのは、いくつかの機能をひとまとめにした集合体のことです。datetimeは、日時を処理する機能をひとまとめにしたものです。以下のような行をプログラムの先頭に書いて、datetimeを使えるようにします。

from datetime import datetime

現在の日時を取得する

現在の日時を取得するにはdatetime.now()を使います。

dt = datetime.now()
print(dt)

datetime.now()は、現在の日時を表すデータを返します。上の例ではこのデータをdtという変数(variable)に入れています。それをprint()で表示すると、以下のような出力となります。

2022-06-08 14:27:38.719089

年、月、日がハイフンでつながったものが最初に表示され、それに続いて時刻が表示されます。14:27:38の部分は14時27分38秒を表しています。最後の.719089はマイクロ秒で、14時27分38秒と14時27分39秒の間をマイクロ秒単位で測ったものです。ちなみにミリ秒は1秒の千分の1(1/1000 秒)、マイクロ秒は1秒の百万分の1(1/1000000 秒)です。

年からマイクロ秒まで全てを見るのではなく、その一部だけを取得したい場合には以下のようにします。

dt = datetime.now()
print(dt.year)
print(dt.month)
print(dt.day)
print(dt.hour)
print(dt.minute)
print(dt.second)
print(dt.microsecond)

今日の曜日を取得するには、以下のようにします。

dt = datetime.now()
print(dt.weekday())

weekday()は、0以上6以下の整数値を返し、0が月曜、1が火曜、2が水曜。。。という意味づけになっています。この整数値を、曜日を示す文字に変換するには以下のようにします。

daysOfWeek = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
dt = datetime.now()
dow = daysOfWeek[dt.weekday()]
print("Day of week: " + dow)

daysOfWeekは、曜日を示す文字(”Mon”、”Tue”、”Wed”…)を並べたリストです。リストについてはこのページを参照ください。

上記で述べたことをまとめたサンプルプログラムが、current-time.pyです。

日時を比較する

次に、ある日時と別の日時を比較する方法を説明します。datetime-comparison.pyを見てください。まず以下のようにして、特定の日時(2029年7月22日11時00分)を設定しています。

dt =datetime(year=2029, month=7, day=22, hour=11, minute=0)

このとき、時刻(hourとminute)は省略可能です。その場合は、デフォルトの時刻として0時0分が使われます。

次に、現在の日時を取得しています。

now = datetime.now()

そして、この2つの日時(dtとnow)を比較します。以下のように大小の記号を使えます。

dt > now

ここでは、dtがnowより大きい(将来の日時)かどうかを調べています。以下は、dtがnowより小さい(過去の日時)かどうかを調べています。

dt > now

大小の記号以外に、イコール(=)、以上(>=)、以下(<=)の記号も使えます。

この2つの日時(dtnow)の時間差を調べるには、日時の引き算をします。時間差は秒数で表されており、それを取得するには以下のようにします。

timeDiff = dt - now
print(timeDiff.total_seconds(), "seconds in total")

時間差が大きい場合(複数日になるような場合)は、timeDiff.daystimeDiff.secondsとして、日数と、残りの秒数を取得できます。これにより、「◯日□秒」という表示ができるようになります。

print(timeDiff.days, "days and", timeDiff.seconds, "seconds")
```python
yrs = timeDiff.days // 365
days = timeDiff.days % 365

「//」は、割り算の商を得るための記号、「%」は割り算の余りを得るための記号です。例えば、12 // 10 = 112 % 10 = 2になります(12を10で割ると、答えば1あまり2になるので)。上のコードでyrsが「△年◯日」の△の数字になり、daysが◯の数字になります。

また、timeDiff.secondsで取得した「時間差の秒数」が大きい場合、「X時間□秒」という表記にしたいことがあります。その場合には、自分で「X時間」と「□秒」の部分を計算する必要があります。そのために以下の計算をします。

mins = timeDiff.seconds // 60
secs = timeDiff.seconds % 60

hrs = mins // 60
mins2 = mins % 60

### 日時を移動させる(調節する)



### タイムゾーン別の日時を取得する

datetime.now()が返す日時は、ラズパイに設定されている(デフォルトの)タイムゾーンに基づいています。このデフォルトのタイムゾーンは、ラズパイOSをインストールするときに設定したものです。何がデフォルトのタイムゾーンに設定されているかを調べるには、Raspberry Pi Configruation(ラズパイ画面左上のラズベリーアイコンをクリックし、Preferences -> Raspberry Pi Configruationを選択)で「Localisation」をクリックし、続いて「Timezone」をクリックしてください。ボストン周辺でラズパイOSをインストールしたのであれば、以下の写真のようになっているはずです。これはアメリカ東部標準時(EST: Eastern Standard Time)がデフォルトのタイムゾーンになっているということです。

<img src = "images/locale.jpg" width="400">

datetime.now()を使うときに、デフォルトではない別のタイムゾーンでの日時を取得することもできます。これを簡単にやるには、datetimeに加えて[pytz](https://pypi.org/project/pytz/)というモジュールを使うのがおすすめです。pytzを使うと、[tz database](https://en.wikipedia.org/wiki/Tz_database)という国際的なタイムゾーン表記集に基づいてタイムゾーンを指定できるようになります。

ラズパイにpytzがすでにインストールされている場合と、されていない場合がありえます。もしpytzを使おうとして

`ModuleNotFoundError: No module named 'pytz'`

というようなエラーが出たら、pytzがインストールされていないということです。その場合は、このページの最後のセクションを参考にインストールしてください。-->

<!-- サマータイム、daylight saving time、うるう年 -->

pytzを使うには、プログラム先頭部分に以下の一文を加えます。
```Python
import pytz

そして、次のようにタイムゾーンを指定して日時を取得します。

est = pytz.timezone("US/Eastern")
dt = datetime.now(est)

タイムゾーンを指定するにはpytz.timezone()を使います。ここでは”US/Eastern”をpytz.timezone()に渡しているので、アメリカ東部標準時(EST: Eastern Standard Time)を指定しています。タイムゾーンに関する情報が変数estに入り、それをdatetime.now()に渡すことで、ESTでの現在の日時が返されます。上記の2行のプログラムを1行でまとめると次のようになります。2行で書いても1行で書いてもプログラムの実行結果は同じです。自分にとって見やすい(理解しやすい)方を使ってください。

dtEst = datetime.now( pytz.timezone("US/Eastern") )

pytz.timezone()に渡すタイムゾーン(たとえば”US/Eastern”)は、tz databaseの表記法にしたがいます。利用できるタイムゾーン表記一覧はここにまとまっています(「TZ database name」というところを参照)。アメリカの代表的な7つの標準時は以下のように表記します。

標準時の一般的な名称 pytzで使うタイムゾーン表記
東部標準時(EST) “US/Eastern”
中部標準時(CST) “US/Central”
山岳部標準時(MST) “US/Arizona”
山岳部夏時間(MDT) “US/Mountain”
太平洋標準時(PST) “US/Pacific”
アラスカ標準時(AKST) “US/Alaska”
ハワイ・アリューシャン標準時(HAST) “US/Hawaii”

また、日本標準時(Japan Standard Time: JST)は”Japan”と表記します。ここまでのことをまとめたサンプルプログラムが、current-time-tz.pyです。

なお、全世界共通の標準時である「協定世界時(UTC)」は、pytzでは”UTC”と表記します。UTCは、グリニッジ標準時(Greenwich Mean Time: GMT)と同じ時刻です。pytzで、GMTは”GMT”と表記します。

標準時の一般的な名称 pytzで使うタイムゾーン表記
日本標準時(JST) “Japan”
協定世界時(UTC) “UTC”
グリニッジ標準時(GMT) “GMT”

日時をタイムゾーンごとに変換する

あるタイムゾーンでの日時を、別のタイムゾーンでの日時に変換することもできます。次のようにastimezone()を使います。

dtEst = datetime.now( pytz.timezone("US/Eastern") )
dtJst = dtEst.astimezone( pytz.timezone("Japan") )

ここでは、東部標準時での現在の日時を取得し、それを変数dtEstに入れて、その後astimezone()を使って日本標準時へ変換しています。astimezone()に渡すのは、変換先のタイムゾーンです(ここでは日本標準時)。

サンプルプログラムはdt-conversion.pyです。

pytzをインストールする方法

まずは、ラズパイOSを最新の状態にアップデートしてください。Terminalで以下のコマンドを実行します。

sudo apt update -y

次に、以下のコマンドを実行:

sudo apt full-upgrade -y

これで、ラズパイOSが最新の状態にアップデートされました。続いて、以下のコマンドを実行してpytzをインストールしてください。

sudo pip3 install pytz

自習プロジェクトの目次に戻る