LoginSignup
2
0

More than 5 years have passed since last update.

[メモ] pythonで1行timezoneクラス作成

Posted at

ちょっとした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でちょっとしたコードを書きたい時は使ってみて下さい。

2
0
3

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
2
0