LoginSignup
1
1

More than 5 years have passed since last update.

Timexのlocal timezoneの扱いでハマったこと

Posted at

状況

JSTの現在時刻を取得しようとして、Timex.DateTime.local/0を実行したところ、AmazonLinuxでは動作するのに手元のCentOSでは動作しない・・という事象が発生。このバグの調査過程でTimexのlocal timezoneの取得処理を調べたのでまとめる。

環境

Elixir 1.3.0
Timex 2.1.6

原因

TimexではTZ環境変数を再優先で利用するが、JST-9の書式は利用できず、Asia/Tokyoの形式しか利用できない。
今回の環境では、CentOS側にのみTZ=JST-9が設定されていたのが原因だった。

概要

ドキュメントにある通り、Linuxでのtimezoneは以下の順に取得していき、取得できたらそれを利用する。

  1. TZ環境変数
  2. /etc/timezone
  3. /etc/sysconfig/clock
  4. /etc/conf.d/clock
  5. /etc/localtime
  6. /usr/local/etc/localtime

今回問題になったのがTZ環境変数にJST-9と設定してあると、Timex上では Asia/Tokyo の書式しか利用できないためにエラーになるということだった。
これは、Tzdataを利用して、timezoneを判定しているため。

呼び出しの流れは以下のとおり。

  1. Timex.DateTime.local/0
  2. Timex.Timezone.local/1
  3. Timex.Timezone.get/2
  4. Timex.Timezone.name_of/1
  5. Tzdata.zone_exists?/1
  6. Timex.Timezone.lookup_posix/1

Tzdata.zone_exists?/1で、falseが返された後に Timex.Timezone.lookup_posix/1で全てのTzdataからチェックをかけているが、JST-9の書式は判定できないので、{:error, {:invalid_timezone, tz}}が返される。

まとめ

日付処理は面倒な処理が多いのでTimexを多用するものの、ちょっとしたことで結構ハマる。なので、Timexあるあるがもっと増えると嬉しいと思った。
また、1.3で導入されたCalendar moduleも試して、導入を検討していきたい。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1