2011-11-02 1 views
11

私は現在、素朴なPythonのdatetimesを返すカレンダーシステムのバックエンドに取り組んでいます。フロントエンドの仕組みはさまざまなカレンダーイベントを作成し、フロントエンドは作成したイベントの素朴なバージョンを返します(たとえば、ユーザーが午後3時から4時まで1020年10月5日を選択した場合、フロントエンドは開始日としてdatetime.datetime(2020,10,5,15,0,0)、終了日としてdatetime.datetime(2011,10,5,16,0,0)です。Pythonで単純な日時をDST対応日時に変換するにはどうすればよいですか?

私がする必要があるのは、単純なdatetimeをデータベースに格納するためにUTCに変換するシステムの各ユーザーは既にタイムゾーンの設定を指定しているので、naive datetimeはタイムゾーンの設定と同じタイムゾーンであると見なされます。ユーザーがタイムゾーンを変更すると、既存のイベントはスケジュールされた正しい時刻にレンダリングされます。

フロントエンドは私のコントロールの外にあるので、私が受け取っているデータを変更することはできません。データベース設計も私のコントロール外にあるので、どのデータがどのように格納されているのかを変更することはできません。

import pytz 
def convert_to_UTC(naive_datetime, user_tz_preference): 
    user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
    utc_datetime = user_datetime.astimezone(pytz.utc) 

私は夏時間に関連しているに走った問題:ここで

は、私がこれまでに撮影したおおよそのアプローチである「置き換え」を使用していることを

>>> from datetime import datetime 
>>> import pytz 
>>> user_tz_preference = pytz.timezone('US/Pacific') 
>>> naive_datetime = datetime(2011, 10, 26, 12, 0, 0) 
>>> user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
>>> user_datetime 
datetime.datetime(2011, 10, 26, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 
>>> received_utc = user_datetime.astimezone(pytz.utc) 
>>> received_utc 
datetime.datetime(2011, 10, 26, 20, 0, tzinfo=<UTC>) 
>>> expected_utc = datetime(2011, 10, 26, 19, 0, tzinfo=pytz.utc) 
>>> expected_utc == received_utc 
False 

お知らせタイムゾーンを設定し、日付にかかわらずPDTの代わりにPSTに変更すると、予想される7時間のDSTオフセットではなく8時間のUTCオフセットが与えられ、時間が正しく保存されなくなります。

naive datetimeを正しいPDT(または他のタイムゾーン相対DST)tzinfoに変換するためのオプションは何ですか?

(また、DSTを監視する時間帯にすべてのユーザーが住んでいるわけではなく、異なる時間に切り替わるタイムゾーンに住んでいるわけではないことに注意してください。タイムゾーンがDSTをサポートしているかどうか、またその日付が切り替わるかどうかを知る必要があります)。

+0

http://www.enricozini.org/2009/debian/using-python-datetime/の –

+0

可能重複[気づかない日時のタイムゾーンの作り方pythonで認識して](http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-python) – Pureferret

答えて

18

Pytzのlocalize機能は、これを行うことができます:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

from datetime import datetime 
import pytz  

tz = pytz.timezone('US/Pacific') 
naive_dt = datetime(2020, 10, 5, 15, 0, 0) 
utc_dt = tz.localize(naive_dt, is_dst=None).astimezone(pytz.utc) 
# -> 2020-10-05 22:00:00+00:00 
+0

ありがとう。これは私が探していたようだ。 – Jay

関連する問題