私は、OSのタイムゾーン変換をスキップして、外部デバイスのタイムゾーンを考慮に入れて、特定の時間を別の形式に変換しようと取り組んできました。
最初は、UTC秒単位の時刻と、デバイスからのタイムゾーンがあります。たとえば、私が今いる場所では、時刻は秒= 1343931446、タイムゾーン=-0700です。私がやろうとしているのは、これをフォーマットYYYYMMDD_HHMMSS
に変換することです。これはしばらくの間適切に機能していました。上記の値の場合、はになります20120802_111726
。
この次のコードブロックは、私が書いたときから、都合の良いことに7月11日に機能しました。問題は、1日が1桁しかない場合(つまり、昨日から開始)、解析が失敗し、私が取得するという事実に帰着します20120821_011726
。問題は、時刻の値を日時に変換するときであると推測しています。印刷するときのようにtime_t
、を取得しますtime.struct_time(tm_year=2012, tm_mon=8, tm_mday=2, tm_hour=18, tm_min=17, tm_sec=26, tm_wday=3, tm_yday=215, tm_isdst=0)
。これは、に解析されると1文字の文字列として扱われますdatetime
。
問題は、datetimeに月/時の日の2文字の入力を受け入れさせて、適切に解析できるようにすることはできますか、それともこれらの形式を変換するためのより良い方法がありますか?この現在のメソッドは、現在のシステム時間を説明するメソッドを使用できないために作成されたものであることに注意してください。これは、システム上で秒があったデバイスとタイムゾーンが同じであることが保証されていない場合に行われます。から得られました。
def convert_time(seconds, tz):
""" Times obtained were in seconds since epoch.
Convert to format YYYYMMDD_HHMMSS.
"""
time_t = time.gmtime(seconds) # convert to time tuple
# convert to datetime format - because time zone comparisons can't be made
# in a format directly convertible from UTC
time_dt = datetime.datetime.strptime(str(time_t.tm_year) +
str(time_t.tm_mon) +
str(time_t.tm_mday) +
str(time_t.tm_hour) +
str(time_t.tm_min) +
str(time_t.tm_sec),
'%Y%m%d%H%M%S')
# Convert time zone to timedelta
offset = datetime.timedelta(hours=int(tz.lstrip('-')[:2]),
minutes=int(tz.lstrip('-')[2:]))
sign = -1 if tz.startswith('-') else 1
time_dt = time_dt + sign * offset
time_dt = time_dt.strftime('%Y%m%d_%H%M%S')
return time_dt