GMTとUTCとJSTとUNIX時間とPythonの狭間を泳ぐ

  • 環境

時間の種類が覚えられません。

GMTUTCJST・・・どれがなにか覚えられないので記録しておきます。

時間の種類 概要 現在時間 UTCへ変換 JSTへ変換 UNIX時間
へ変換
GMT グリニッジ天文台
での時間
- - - -
UTC GMTをちょっぴり
調整した時間
datetime.
datetime.now
(timezone.utc)
- utc_time.
astimezone
(timezone(timedelta
(hours=+9)))
utc_time.
timestamp()
JST 本の時間 datetime.
datetime.now()
jst_time.astimezone
(timezone.utc)
- jst_time.
timestamp()
UNIX
時間
コンピュータ用の時間 int(time.time()) datetime.fromtimestamp
(unix_time, timezone.utc)
datetime.
fromtimestamp
(unix_time)
-

GMTは、ロンドン郊外にあるグリニッジ天文台での時間です。

https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Royal_observatory_greenwich.jpg/240px-Royal_observatory_greenwich.jpg
グリニッジ天文台 - Wikipedia

UTCは、GMTをちょっぴり調整した世界の標準時間です。

  • 日本語 : 協定世界時
  • 英語 : Universal Time, Coordinated(調整された)

地球の自転速度の変動でちょっとずつ時間がずれるのでうるう秒で調整しています。

citizen.jp

Pythonで現在時間のUTCを取得してみました。

>>> from datetime import datetime, timezone, timedelta
# datetime.utcnow()よりdatetime.now(timezone.utc)を使うようにしたほうが良いそうです。
>>> utc_time = datetime.utcnow()
>>> print(utc_time)
2020-02-13 13:01:52.177821
>>> utc_time = datetime.now(timezone.utc)
>>> print(utc_time)
2020-02-13 13:02:08.306656+00:00

classmethod datetime.utcnow()
tzinfo が None である現在の UTC の日付および時刻を返します。

このメソッドは now() と似ていますが、 naive な datetime オブジェクトとして現在の UTC 日付および時刻を返します。 aware な現在の UTC datetime は datetime.now(timezone.utc) を呼び出すことで取得できます。
警告 naive な datetime オブジェクトは多くの datetime メソッドでローカルな時間として扱われるため、 aware な datetime を使って UTC の時刻を表すのが好ましいです。 そのため、 UTC での現在の時刻を表すオブジェクトの作成では datetime.now(timezone.utc) を呼び出す方法が推奨されます。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

JSTは、UTCより9時間進んでる日本での時間です。

Pythonで現在時間のJSTを取得してみました。

>>> from datetime import datetime, timezone, timedelta
>>> jst_time = datetime.now()
>>> print(jst_time)
2020-02-13 22:01:39.673451

classmethod datetime.now(tz=None)
現在のローカルな日時を返します。

オプションの引数 tz が None であるか指定されていない場合、このメソッドは today() と同様ですが、可能ならば time.time() タイムスタンプを通じて得ることができる、より高い精度で時刻を提供します (例えば、プラットフォームが C 関数 gettimeofday() をサポートする場合には可能なことがあります)。
tz が None でない場合、 tz は tzinfo のサブクラスのインスタンスでなければならず、現在の日付および時刻は tz のタイムゾーンに変換されます。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

UNIX時間は、OSなどで使われるUTCでの1970-01-01 00:00:00からの経過秒数です。

  • 別名 : POSIX time(ポジックスタイム)
  • 日本語 : UNIX時間

Pythonで現在時間のUTCを取得してみました。

>>> import time from time
>>> unix_time = int(time())
>>> print(unix_time)
1581601932

time.time() → float
エポック からの秒数を浮動小数点数で返します。 エポックの具体的な日付とうるう秒 (leap seconds) の扱いはプラットフォーム依存です。 Windows とほとんどの Unix システムでは、エポックは (UTC で) 1970 年 1 月 1 日 0 時 0 分 0 秒で、うるう秒エポック秒の時間の勘定には入りません。 これは一般に Unix 時間 と呼ばれています。 与えられたプラットフォームでエポックが何なのかを知るには、 time.gmtime(0) の値を見てください。
time --- 時刻データへのアクセスと変換 — Python 3.8.2rc1 ドキュメント

いろんな時間があるからPythonで変換もしてみました。

UTCからJSTへ変換してみました。

>>> from datetime import datetime, timezone, timedelta
>>> utc_time = datetime.now(timezone.utc)
# UTCからJSTへ変換してみました。
>>> jst_time = utc_time.astimezone(timezone(timedelta(hours=+9)))
>>> print(utc_time)
2020-02-13 14:05:37.511844+00:00
>>> print(jst_time)
2020-02-13 23:05:37.511844+09:00

timedelta オブジェクト
timedelta オブジェクトは経過時間、すなわち二つの日付や時刻間の差を表します。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
全ての引数がオプションで、デフォルト値は 0 です。 引数は整数、浮動小数点数でもよく、正でも負でもかまいません。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

UTCからUNIX時間へ変換してみました。

>>> from datetime import datetime, timezone
>>> utc_time = datetime.now(timezone.utc)
# UTCからUNIX時間へ変換してみました。
>>> unix_time = utc_time.timestamp()
>>> print(utc_time)
2020-02-13 22:10:53.173734+00:00
>>> print(unix_time)
1581631853.173734

datetime.timestamp()
datetime インスタンスに対応する POSIX タイムスタンプを返します。 返り値は time.time() で返される値に近い float です。

このメソッドでは naive な datetime インスタンスはローカル時刻とし、プラットフォームの C 関数 mktime() に頼って変換を行います。 datetime は多くのプラットフォームの mktime() より広い範囲の値をサポートしているので、遥か過去の時刻や遥か未来の時刻に対し、このメソッドは OverflowError を送出するかもしれません。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

JSTからUTCへ変換してみました。

>>> from datetime import datetime, timezone, timedelta
>>> jst_time = datetime.now()
# JSTからUTCへ変換してみました。
>>> utc_time = jst_time.astimezone(timezone.utc)
>>> print(jst_time)
2020-02-13 22:59:58.017838
>>> print(utc_time)
2020-02-13 13:59:58.017838+00:00

datetime.astimezone(tz=None)
tz を新たに tzinfo 属性 として持つ datetime オブジェクトを返します。 日付および時刻データを調整して、返り値が self と同じ UTC 時刻を持ち、 tz におけるローカルな時刻を表すようにします。

もし与えられた場合、 tz は tzinfo のサブクラスのインスタンスでなければならず、 インスタンスの utcoffset() および dst() メソッドは None を返してはなりません。もし self が naive ならば、おそらくシステムのタイムゾーンで時間を表現します。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

JSTからUNIX時間へ変換してみました。

>>> from datetime import datetime, timezone
>>> jst_time = datetime.now()
# JSTからUNIX時間へ変換してみました。
>>> unix_time = jst_time.timestamp()
>>> print(jst_time)
2020-02-14 07:15:27.515381
>>> print(unix_time)
1581632127.515381

UNIX時間からUTCへ変換してみました。

>>> from datetime import datetime, timezone
>>> from time import time
>>> unix_time = int(time())
# UNIX時間からUTCへ変換してみました。
>>> utc_time = datetime.fromtimestamp(unix_time, timezone.utc)
>>> print(unix_time)
1581603619
>>> print(utc_time)
2020-02-13 14:20:19+00:00

class datetime.timezone(offset, name=None)
ローカル時刻と UTC の差分を表す timedelta オブジェクトを offset 引数に指定しなくてはいけません。これは -timedelta(hours=24) から timedelta(hours=24) までの両端を含まない範囲に収まっていなくてはなりません。そうでない場合 ValueError が送出されます。

timezone.utc
UTC タイムゾーン timezone(timedelta(0)) です。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

UNIX時間からJSTへ変換してみました。

>>> from datetime import datetime
>>> from time import time
>>> unix_time = int(time())
# UNIX時間からJSTへ変換してみました。
>>> jst_time = datetime.fromtimestamp(unix_time)
>>> print(unix_time)
1581603238
>>> print(jst_time)
2020-02-13 23:13:58

classmethod datetime.fromtimestamp(timestamp, tz=None)
time.time() が返すような、 POSIX タイムスタンプに対応するローカルな日付と時刻を返します。オプションの引数 tz が None であるか、指定されていない場合、タイムスタンプはプラットフォームのローカルな日付および時刻に変換され、返される datetime オブジェクトは naive なものになります。
datetime --- 基本的な日付型および時間型 — Python 3.8.2rc1 ドキュメント

f:id:ponsuke_tarou:20200214072422j:plain
神奈川県二宮の吾妻公園