今回はSTM32のGCCの標準ライブラリ関数<time.h>でタイムゾーンを設定する方法を紹介します。

STM32が他のシステム(PCやマイコン等)と時間情報の通信を行うようなシステムの場合、多くの場合は標準Cライブラリが定義しているtime_t型(Unix時間)を用いて通信を行います。
しかし、Unix時間はUTC(協定世界時)の1970/01/01 00:00からの秒数であるため、タイムゾーンが設定されたシステムからUnix時間の情報を受け取り、STM32のタイムゾーンを設定しないままGCCの標準ライブラリ関数<time.h>のlocaltime関数などを使って地方標準時に変換しようとしても、デフォルトのタイムゾーンはUTCとなっているため日本の地方標準時よりも9時間前の時間となってしまします。
したがって、Unix時間から日本の地方標準時を得るためには実行環境にタイムゾーンを設定する必要があります。 なお、ここではIDEにSW4STM32 (System Workbench for STM32)、コンパイラにはAc6 STM32 MCU GCCを用いています。

設定方法は簡単です。
標準ライブラリ関数<stdlib.h>をインクルードした上で以下の関数を実行するだけです。

putenv("TZ=JST-9");

putenvはシステムの環境変数の値を設定する関数です。引数には環境変数を入力します。
TZはタイムゾーンを定義する環境変数です。 TZにはまず3文字のタイムゾーン名を設定します。日本標準時の場合はJST(Japan Standard Time) です。 続いてUTCとJSTの時間差を時間単位で設定します。 日本時間はUTCより9時間進んでいるため-9になります。

putenv関数を設定した後はlocaltime関数等でUnix時間から地方標準時への変換が可能になります。

たとえば、以下のプログラムをNUCLEO-L476RGで実行してみました。

結果は以下のようになりました。

putenv関数でタイムゾーンを設定できていることがわかります。