LoginSignup
5
6

More than 3 years have passed since last update.

[Python3] struct_timeからdatetimeに変換する方法(タイムゾーン付き)

Last updated at Posted at 2019-07-04

はじめに

タイムゾーンを考慮しつつ time.struct_time から datetime.datetime に変換する方法を片っ端から挙げていきます。
Python 3 向けです。

タイムゾーンについて

各種例では Asia/Tokyo (JST) で変換していますが、ローカルタイムに依存しない変換なのでタイムゾーンを他の地域に変えても動きます。

struct_time から datetime(naive) に変換

タイムゾーン情報を持たない(naiveな)datetime に変換する方法です。

datetime(*struct_time[:6])

from datetime import datetime

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
dt = datetime(*struct_time[:6])
# -------------------------------

print(dt)
# 2019-07-03 07:32:12

struct_time(UTC) から datetime(JST) に変換

UTC > JST (datetimeのみ)

datetime モジュールのみを使って UTC の struct_time から JST の datetime に変換する方法です。

datetime(*struct_time[:6], tzinfo=timezone.utc).astimezone(timezone())

from datetime import datetime, timedelta, timezone

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = timezone(timedelta(hours=+9), 'Asia/Tokyo')
d_jst = datetime(*struct_time[:6], tzinfo=timezone.utc).astimezone(tz)
# -------------------------------

print(d_jst)
# 2019-07-03 16:32:12+09:00

UTC > JST (pytz)

datetime モジュールと pytz ライブラリを使って UTC の struct_time から JST の datetime に変換する方法です。

datetime(*struct_time[:6], tzinfo=pytz.utc).astimezone(pytz.timezone())

from datetime import datetime
import pytz

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = pytz.timezone('Asia/Tokyo')
d_jst = datetime(*struct_time[:6], tzinfo=pytz.utc).astimezone(tz)
# -------------------------------

print(d_jst)
# 2019-07-03 16:32:12+09:00

UTC > JST (calendar.timegm)

datetime モジュールと calendar モジュールを使って UTC の struct_time から JST の datetime に変換する方法です。

datetime.fromtimestamp(timegm(struct_time), tz=timezone())

from datetime import datetime, timedelta, timezone
from calendar import timegm

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = timezone(timedelta(hours=+9), 'Asia/Tokyo')
d_jst = datetime.fromtimestamp(timegm(struct_time), tz=tz)
# -------------------------------

print(d_jst)
# 2019-07-03 16:32:12+09:00

UTC > JST (calendar.timegm + pytz)

datetime モジュールと calendar モジュールと pytz ライブラリを使って UTC の struct_time から JST の datetime に変換する方法です。

datetime.fromtimestamp(timegm(struct_time), tz=pytz.timezone())

from datetime import datetime
from calendar import timegm
import pytz

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = pytz.timezone('Asia/Tokyo')
d_jst = datetime.fromtimestamp(timegm(struct_time), tz=tz)
# -------------------------------

print(d_jst)
# 2019-07-03 16:32:12+09:00

struct_time(JST) から datetime(JST) に変換

JST > JST (datetimeのみ)

datetime モジュールのみを使って JST の struct_time から JST の datetime に変換する方法です。

datetime(*struct_time[:6], tzinfo=timezone())

from datetime import datetime, timedelta, timezone

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = timezone(timedelta(hours=+9), 'Asia/Tokyo')
d_jst = datetime(*struct_time[:6], tzinfo=tz)
# -------------------------------

print(d_jst)
# 2019-07-03 07:32:12+09:00

JST > JST (pytz)

datetime モジュールと pytz ライブラリを使って JST の struct_time から JST の datetime に変換する方法です。

pytz.timezone().localize(datetime(*struct_time[:6]))

from datetime import datetime
import pytz

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = pytz.timezone('Asia/Tokyo')
d_jst = tz.localize(datetime(*struct_time[:6]))
# -------------------------------

print(d_jst)
# 2019-07-03 07:32:12+09:00

struct_time(JST) から datetime(UTC) に変換

JST > UTC (datetimeのみ)

datetime モジュールのみを使って JST の struct_time から UTC の datetime に変換する方法です。

datetime(*struct_time[:6], tzinfo=timezone()).astimezone(timezone.utc)

from datetime import datetime, timedelta, timezone

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = timezone(timedelta(hours=+9), 'Asia/Tokyo')
d_utc = datetime(*struct_time[:6], tzinfo=tz).astimezone(timezone.utc)
# -------------------------------

print(d_utc)
# 2019-07-02 22:32:12+00:00

JST > UTC (pytz)

datetime モジュールと pytz ライブラリを使って JST の struct_time から UTC の datetime に変換する方法です。

pytz.timezone().localize(datetime(*struct_time[:6])).astimezone(pytz.utc)

from datetime import datetime
import pytz

struct_time = datetime.strptime('2019-07-03 07:32:12', '%Y-%m-%d %H:%M:%S').timetuple()

# --- struct_time -> datetime ---
tz = pytz.timezone('Asia/Tokyo')
d_utc = tz.localize(datetime(*struct_time[:6])).astimezone(pytz.utc)
# -------------------------------

print(d_utc)
# 2019-07-02 22:32:12+00:00
5
6
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
5
6