ローカル時刻文字列を UTC に変換するにはどうすればよいですか?
質問
日時を変換するにはどうすればよいですか 現地時間の文字列 に UTC 時間の文字列?
以前にこれを実行したことがあるはずですが、見つけることができません。将来、私(および他の人)がそれを行うのに役立つことを願っています。
説明:たとえば、私が持っている場合 2008-09-17 14:02:00
私の現地のタイムゾーンでは (+10
)、同等の文字列を生成したいと考えています UTC
時間: 2008-09-17 04:02:00
.
また、から http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, DST やその他の問題では、現地時間から UTC 時間への一意の変換がないため、一般にこれは不可能であることに注意してください。
解決 3
@rofly に感謝します。文字列から文字列への完全な変換は次のとおりです。
time.strftime("%Y-%m-%d %H:%M:%S",
time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00",
"%Y-%m-%d %H:%M:%S"))))
私のまとめとしては、 time
/calendar
機能:
time.strptime
文字列 --> タプル (タイムゾーンが適用されていないため、文字列と一致します)
time.mktime
ローカル時間タプル --> エポックからの秒数 (常にローカル時間)
time.gmtime
エポックからの秒数 --> UTC のタプル
そして
calendar.timegm
UTC のタプル --> エポックからの秒数
time.localtime
エポックからの秒数 --> ローカルタイムゾーンのタプル
他のヒント
まず、文字列を単純な日時オブジェクトに解析します。これは次の例です datetime.datetime
タイムゾーン情報が添付されていません。ドキュメントを参照してください datetime.strptime
日付文字列の解析については、「日付文字列の解析」を参照してください。
使用 pytz
モジュールには、タイムゾーンと UTC の完全なリストが付属しています。ローカルのタイムゾーンを把握し、そこからタイムゾーン オブジェクトを構築し、それを操作して単純な datetime にアタッチします。
最後に、使用します datetime.astimezone()
日時を UTC に変換するメソッド。
ローカル タイムゾーン「America/Los_Angeles」を使用した、文字列「2001-2-3 10:11:12」のソース コード:
import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)
そこから、 strftime()
必要に応じて UTC 日時をフォーマットするメソッド:
utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
日時モジュールの utcnow() 関数を使用して、現在の UTC 時間を取得できます。
>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'
トムが上記で言及したリンクのように: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ 言います:
UTCは、夏時間の節約のないタイムゾーンであり、それでも過去に構成が変更されていないタイムゾーンです。
常に UTC で時間を測定して保存します.
時間がかかった場所を記録する必要がある場合は、それを別に保存してください。 しないでください 現地時間とタイムゾーン情報を保存します。
注記 - データのいずれかが DST を使用する地域にある場合は、次を使用します。 pytz
John Millikin の答えを見てください。
指定された文字列から UTC 時間を取得したい場合、幸運にも DST を使用していない世界の地域にいる場合、または DST が適用されていない UTC からのオフセットのみのデータがある場合は、次のようにします。
--> オフセット値の基準として現地時間を使用します。
>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'
--> または、既知のオフセットから、datetime.timedelta() を使用します。
>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'
アップデート:
Python3.2以降 datetime.timezone
利用可能です。以下のコマンドを使用して、タイムゾーン対応の日時オブジェクトを生成できます。
import datetime
timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)
タイムゾーンの変換に取り組む準備ができている場合は、これを読んでください。
一般的な Python 時間変換の概要を次に示します。
一部のメソッドは秒の小数部分を切り捨て、次のようにマークされます。 (s). 。次のような明示的な式 ts = (d - epoch) / unit
代わりに使用できます (jfs に感謝)。
- struct_time (UTC) → POSIX (s):
calendar.timegm(struct_time)
- Naïve datetime (ローカル) → POSIX (s):
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(DST 移行中の例外。jfs からのコメントを参照) - ナイーブ日時 (UTC) → POSIX (s):
calendar.timegm(dt.utctimetuple())
- 認識日時 → POSIX (s):
calendar.timegm(dt.utctimetuple())
- POSIX → struct_time (UTC、 s):
time.gmtime(t)
(jfs からのコメントを参照) - Naïve datetime (ローカル) → struct_time (UTC、 s):
stz.localize(dt, is_dst=None).utctimetuple()
(DST 移行中の例外。jfs からのコメントを参照) - ナイーブ日時 (UTC) → struct_time (UTC、 s):
dt.utctimetuple()
- 認識日時 → struct_time (UTC、 s):
dt.utctimetuple()
- POSIX → Naïve datetime (ローカル):
datetime.fromtimestamp(t, None)
(特定の条件では失敗する可能性があります。以下の jfs からのコメントを参照してください) - struct_time (UTC) → Naïve datetime (ローカル、 s):
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(閏秒を表すことはできません。jfs からのコメントを参照してください) - ナイーブ日時 (UTC) → ナイーブ日時 (ローカル):
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
- 認識日時 → ナイーブ日時 (ローカル):
dt.astimezone(tz).replace(tzinfo=None)
- POSIX → ナイーブ日時 (UTC):
datetime.utcfromtimestamp(t)
- struct_time (UTC) → Naïve datetime (UTC、 s):
datetime.datetime(*struct_time[:6])
(閏秒を表すことはできません。jfs からのコメントを参照してください) - ナイーブ日時 (ローカル) → ナイーブ日時 (UTC):
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(DST 移行中の例外。jfs からのコメントを参照) - 認識日時 → ナイーブ日時 (UTC):
dt.astimezone(UTC).replace(tzinfo=None)
- POSIX → 認識される日時:
datetime.fromtimestamp(t, tz)
(pytz 以外のタイムゾーンでは失敗する可能性があります) - struct_time (UTC) → 認識された日時 (s):
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(閏秒を表すことはできません。jfs からのコメントを参照してください) - ナイーブ日時 (ローカル) → 認識日時:
stz.localize(dt, is_dst=None)
(DST 移行中の例外。jfs からのコメントを参照) - ナイーブ日時 (UTC) → 認識日時:
dt.replace(tzinfo=UTC)
ソース: taaviburns.ca
def local_to_utc(t):
secs = time.mktime(t)
return time.gmtime(secs)
def utc_to_local(t):
secs = calendar.timegm(t)
return time.localtime(secs)
ソース: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
使用例から bd808:ソースが datetime.datetime
物体 t
, 、次のように呼び出します。
local_to_utc(t.timetuple())
私は幸運に恵まれています 日付ユーティリティ (これは、他の関連する質問に対して SO で広く推奨されています):
from datetime import *
from dateutil import *
from dateutil.tz import *
# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()
# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')
# Tell the datetime object that it's in local time zone since
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')
(コードはこの回答から派生しました UTC 日時文字列をローカル日時文字列に変換する)
pytz を使用したもう 1 つの例ですが、localize() が含まれており、これで時間を節約できました。
import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')
dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'
私が最も成功したのは、 python-dateutil:
from dateutil import tz
def datetime_to_utc(date):
"""Returns date in UTC w/o tzinfo"""
return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date
import time
import datetime
def Local2UTC(LocalTime):
EpochSecond = time.mktime(LocalTime.timetuple())
utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)
return utcTime
>>> LocalTime = datetime.datetime.now()
>>> UTCTime = Local2UTC(LocalTime)
>>> LocalTime.ctime()
'Thu Feb 3 22:33:46 2011'
>>> UTCTime.ctime()
'Fri Feb 4 05:33:46 2011'
datetime.datetime を希望する場合:
dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")
次のようにして実行できます。
>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
どうですか -
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
秒なら None
次に、現地時間を UTC 時間に変換し、それ以外の場合は、渡された時間を UTC に変換します。
単純
私は次のようにしました:
>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996
派手な実装
さらに凝ったことをしたい場合は、これをファンクターに変えることができます。
class to_utc():
utc_delta = datetime.utcnow() - datetime.now()
def __call__(cls, t):
return t + cls.utc_delta
結果:
>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996
サマータイムの回避などに。
上記の回答はどれも特に役に立ちませんでした。以下のコードは GMT で機能します。
def get_utc_from_local(date_time, local_tz=None):
assert date_time.__class__.__name__ == 'datetime'
if local_tz is None:
local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
local_time = local_tz.normalize(local_tz.localize(date_time))
return local_time.astimezone(pytz.utc)
import pytz
from datetime import datetime
summer_11_am = datetime(2011, 7, 1, 11)
get_utc_from_local(summer_11_am)
>>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)
winter_11_am = datetime(2011, 11, 11, 11)
get_utc_from_local(winter_11_am)
>>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)
使用する http://crsmithdev.com/arrow/
arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')
arrowObj.to('UTC') or arrowObj.to('local')
このライブラリは生活を楽にしてくれます:)
Python3では:
pip install python-dateutil
from dateutil.parser import tz
mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None)
別の質問で最良の回答を見つけました ここ. 。Pythonの組み込みライブラリのみを使用し、ローカルタイムゾーンを入力する必要はありません(私の場合は必須です)。
import time
import calendar
local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)
検索キーワードによっては、リンクされた質問の代わりにこの質問がGoogleに表示されるため、ここに回答を再投稿します。
この場合 ...pytzは最高のライブラリです
import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)