Facebookのstart_timeの時間を変換しようとしています。Facebook のドキュメントによると、Facebook は ISO-8601 文字列を使用して、UTC からのオフセット形式の正確な時刻を記述します。
%Y-%m-%dT%H:%M:%S+OFFSET
API から抽出すると、例 1 のように現地時間として出力されるイベントもあれば、例 2 のようにユーザーの時間として出力されるイベントもあります (イベント 1 と 2 の場所は同じであることに注意してください)。
例 1) eid = 163113227202707、start_time = 2013-06-18T22:00:00-0700
例 2) eid = 590809384285866、start_time = 2013-06-17T01:00:00-0300
夏時間も含めて、現地のイベント時間を使用する必要があります。
次の形式の約 1500 都市のテーブルを作成しました。
city timezone dst offset
Abidjan GMT +0000
Abuja WAT +0100
Accra GMT +0000
Adama EAT +0300
Addis Ababa EAT +0300
Agadez WAT +0100
Agadir WEST DST +0100
Al Jizah EET +0200
Alexandria EET +0200
Algiers CET +0100
Ali Sabieh EAT +0300
Antananarivo EAT +0300
Antsirabe EAT +0300
Arusha EAT +0300
Asmara EAT +0300
Bafatá GMT +0000
Bamako GMT +0000
Bambari WAT +0100
Bamenda WAT +0100
Bangui WAT +0100
Banjul GMT +0000
Bata WAT +0100
Beira CAT +0200
Benghazi CST DST +0200
Benin City WAT +0100
Berbérati WAT +0100
ただし、これは静的であるため、夏時間には役立ちません。
pytz に関するドキュメントを読んでも、都市名に基づいてタイムゾーンを照会する方法がわかりません。これは可能ですか?
基本的に、次の疑似コードを作成しようとしています。
start_time = 2013-06-17T01:00:00-0300
UTC_start_time = normalize_time_to_UTC(start_time)
offset = lookup_offset_given_city_and_UTC(city, UTC)
local_start_time(UTC_start_time, offset)
アップデート:
最初に、次のように文字列を解析して、Facebook から提供されたオフセットに基づいて時間を正規化します。
def fql_local_time_to_utc(start_time):
if len(fql_timestamp) < 20:
return fql_timestamp
else:
timestamp = fql_timestamp[:19]
sign = fql_timestamp[19]
hours = fql_timestamp[20:22]
minutes = fql_timestamp[22:24]
offset = int(hours)+int(minutes)/60
if sign =="+":
offset = -offset
timestamp_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S')
utc_object = timestamp_object + datetime.timedelta(hours = offset)
return utc_object
次に、venue_id の location_city を検索し、「pytz_timezone_name」という列を手動で追加した上記のデータベースと一致させようとします。結合クエリを介して関連するタイムゾーンを見つけた後、次のコードを適用します。
try:
tz = db.fetchone()["pytz_timezone_name"]
tz_object = timezone(tz)
local_event_time = timezone('UTC').localize(utc_time).astimezone(tz_object)
local_time = local_event_time.strftime('%Y-%m-%dT%H:%M:%S%z')
except:
local_time = start_time