GMTとUTCとJSTとUNIX時間とPythonの狭間を泳ぐ
- 時間の種類が覚えられません。
- GMTは、ロンドン郊外にあるグリニッジ天文台での時間です。
- UTCは、GMTをちょっぴり調整した世界の標準時間です。
- JSTは、UTCより9時間進んでる日本での時間です。
- UNIX時間は、OSなどで使われるUTCでの1970-01-01 00:00:00からの経過秒数です。
- いろんな時間があるからPythonで変換もしてみました。
時間の種類が覚えられません。
GMTとUTCとJST・・・どれがなにか覚えられないので記録しておきます。
時間の種類 | 概要 | 現在時間 | 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) |
- |
UTCは、GMTをちょっぴり調整した世界の標準時間です。
- 日本語 : 協定世界時
- 英語 : Universal Time, Coordinated(調整された)
地球の自転速度の変動でちょっとずつ時間がずれるのでうるう秒で調整しています。
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時間進んでる日本での時間です。
- 日本語 : 日本標準時
- 英語 : Japan Standard Time
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からの経過秒数です。
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 ドキュメント