ちょっとしたpythonコードを書く際に、日時扱う事はよくあると思います。
そんな時、timezoneが必要になりいちいちpytzをpipインストールするのは面倒だなと感じたため、timezoneクラス(tzinfo継承クラス)を1行で作ってみました。
メモコード
1行コード
1行コード.
JST = type('JST', (__import__('datetime').tzinfo,), {'_tzname': 'JST', '_zone': 'Tokyo', '_utcoffset': __import__('datetime').timedelta(hours=9), '__module__': 'timezone', '__str__': lambda self: self._zone, '__repr__': lambda self: '<tzinfo {} {} {}>'.format(self._zone, self._utcoffset, self._tzname), 'utcoffset': lambda self, dt: self._utcoffset, 'dst': lambda self, dt: __import__('datetime').timedelta(0), 'tzname': lambda self, dt: self._tzname})
pep8準拠コード
pep8準拠コード.
JST = type(
'JST',
(__import__('datetime').tzinfo,),
{'_tzname': 'JST',
'_zone': 'Tokyo',
'_utcoffset': __import__('datetime').timedelta(hours=9),
'__module__': 'timezone',
'__str__': lambda self: self._zone,
'__repr__': lambda self: '<tzinfo {} {} {}>'.format(
self._zone, self._utcoffset, self._tzname),
'utcoffset': lambda self, dt: self._utcoffset,
'dst': lambda self, dt: __import__('datetime').timedelta(0),
'tzname': lambda self, dt: self._tzname}
)
JST日時をUTC系の時間に変換
datetimeにjstタイムゾーンを付加してutcのstruct_timeを作ったりepoch_timeを取得したり.
>>> JST = type('JST', (__import__('datetime').tzinfo,), {'_tzname': 'JST', '_zone': 'Tokyo', '_utcoffset': __import__('datetime').timedelta(hours=9), '__module__': 'timezone', '__str__': lambda self: self._zone, '__repr__': lambda self: '<tzinfo {} {} {}>'.format(self._zone, self._utcoffset, self._tzname), 'utcoffset': lambda self, dt: self._utcoffset, 'dst': lambda self, dt: __import__('datetime').timedelta(0), 'tzname': lambda self, dt: self._tzname})
>>>
>>> import datetime
>>> import calendar
>>>
>>> # JSTのtzinfo継承クラス生成
>>> jst = JST()
>>> jst
<tzinfo Tokyo 9:00:00 JST>
>>>
>>> # replaceでtzinfoを付加
>>> jst_datetime = datetime.datetime.now().replace(tzinfo=JST())
>>> jst_datetime
datetime.datetime(2016, 12, 16, 18, 54, 6, 749383, tzinfo=<tzinfo Tokyo 9:00:00 JST>)
>>>
>>> # jstのdatetimeからutcのstruct_timeを取得
>>> jst_datetime.utctimetuple()
time.struct_time(tm_year=2016, tm_mon=12, tm_mday=16, tm_hour=9, tm_min=54, tm_sec=6, tm_wday=4, tm_yday=351, tm_isdst=0)
>>>
>>> # jstのdatetimeからepoch timeを取得
>>> calendar.timegm(jst_datetime.utctimetuple())
1481882046
あとがき
今回は、日本のタイムゾーン JSTを作成しましたが、「_utcoffset」「_zone」「_tzname」あと「dstメソッド」を修正する事でサマータイムのある別のタイムゾーンを作る事も出来ます。
皆さんも、是非timezoneでちょっとしたコードを書きたい時は使ってみて下さい。