1. ホーム
  2. パイソン

[解決済み】UTCの日付時間の文字列をローカルの日付時間に変換する

2022-04-17 23:15:02

質問

これまでUTCとの時刻変換をする必要がありませんでした。最近、自分のアプリをタイムゾーンに対応させたいという要望があり、自分自身をぐるぐると回しています。ローカルタイムをUTCに変換する情報はたくさんあり、それはかなり初歩的なことだと思いますが(たぶん、これも間違っている)、UTC時間をエンドユーザーのタイムゾーンに簡単に変換する情報は見つかりませんでした。

簡単に言うと、アンドロイドアプリが私(appengineアプリ)にデータを送ってきて、そのデータの中にタイムスタンプが含まれているのです。そのタイムスタンプをUTC時間に保存するために、私は使用しています。

datetime.utcfromtimestamp(timestamp)

これでうまくいっているようです。私のアプリがデータを保存するとき、それは5時間先として保存されます(私はEST -5です)。

データはappengineのBigTableに保存されており、取得するとこのような文字列で出てくる。

"2011-01-21 02:37:21"

この文字列を、ユーザーの正しいタイムゾーンの DateTime に変換するにはどうすればよいですか?

また、ユーザーのタイムゾーン情報を保存するには、どのような方法が推奨されますか? (一般的にどのように時間帯情報を保存するのですか?例えば "-5:00" or "EST" etc etc ?) 私の最初の質問に対する答えには、2番目の質問への答えとなるパラメータが含まれているかもしれないと思います。

解決方法は?

自社で tzinfo オブジェクトを確認します。 python-dateutil(パイソンデートル のライブラリーを使用しています。 を提供しています。 tzinfo の上に実装されます。 ゾーンインフォ(オルソン)データベース というように、タイムゾーンのルールをある程度標準的な名前で参照できるようにします。

from datetime import datetime
from dateutil import tz

# METHOD 1: Hardcode zones:
from_zone = tz.gettz('UTC')
to_zone = tz.gettz('America/New_York')

# METHOD 2: Auto-detect zones:
from_zone = tz.tzutc()
to_zone = tz.tzlocal()

# utc = datetime.utcnow()
utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')

# Tell the datetime object that it's in UTC time zone since 
# datetime objects are 'naive' by default
utc = utc.replace(tzinfo=from_zone)

# Convert time zone
central = utc.astimezone(to_zone)

編集 示すために例を拡大した。 strptime

編集2 API の使用方法を修正し、より良いエントリポイント・メソッドを表示するようにしました。

3を編集 タイムゾーンの自動検出方法を追加しました。