2012-08-25 8 views
6

UTCの日時変換には多大な疑問があり、「最良の方法」のコンセンサスはないようです。どのように、Pythonで、UTCのdatetimeを取る、ユーザーのタイムゾーンを自動検出し、datetimeを希望の形式に変換しますか?

これによると:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/、pytzが最善の方法です。彼は私が見

みんな「replaceがないを行い、localizeは夏時間に合わせて調整、」この男https://stackoverflow.com/a/7465359/523051が言う...

をこのdatetime.datetime.utcnow().replace(tzinfo=pytz.utc)のようにタイムゾーンに変換するが、彼は、ユーザーのタイムゾーンを取得する方法を言っていない示していpytzは自分のタイムゾーン(users_timezone = timezone("US/Pacific"))を提供していますが、これはあなたの視聴者がどこにいるのかわからないのでわかりません...

この男https://stackoverflow.com/a/4771733/523051はタイムゾーンを自動検出する方法がありますこれは、dateutilライブラリを使用していますが、Armin Ronacherと正式なpythonのドキュメント(http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior、黄色のボックスでそのアンカーのすぐ上に)

私が必要とするのは、 2012-08-25 10:59:56.511479)、それをユーザーのタイムゾーンに変換します。そして、このようにそれを示しています

Aug 25 - 10:59AM 

と年は現在の年ではない場合、私は

Aug 25 '11 - 10:59AM 

答えて

3

無事を言いたい、ここでは、また(SOへの私の最初の貢献です。 ))私はtzlocalは、()ですべてで動作しないということを学びました

from datetime import datetime 
from dateutil import tz 
import pytz 

def standard_date(dt): 
    """Takes a naive datetime stamp, tests if time ago is > than 1 year, 
     determines user's local timezone, outputs stamp formatted and at local time.""" 

    # determine difference between now and stamp 
    now = datetime.utcnow() 
    diff = now - dt 

    # show year in formatting if date is not this year 
    if (diff.days/365) >= 1: 
     fmt = "%b %d '%y @ %I:%M%p" 
    else: 
     fmt = '%b %d @ %I:%M%p' 

    # get users local timezone from the dateutils library 
    # http://stackoverflow.com/a/4771733/523051 
    users_tz = tz.tzlocal() 

    # give the naive stamp timezone info 
    utc_dt = dt.replace(tzinfo=pytz.utc) 
    # convert from utc to local time 
    loc_dt = utc_dt.astimezone(users_tz) 
    # apply formatting 
    f = loc_dt.strftime(fmt) 

    return f 
+0

それはいくつかのオフをスローすることが2つの外部ライブラリを必要としません...ヒロク。上記の関数は単にUTC時刻を返します。 – chrickso

+0

また、ユーザーのタイムゾーンを正確に判断して時間を自動的に調整するための信頼できる方法であることをすべて忘れてしまいました。私はTwitterがあなたのタイムゾーンを調整する設定を持っているので、これは方法でなければならないことがわかります:ユーザの好みを保存し、それをコンバージョンに使用します。 – chrickso

関連する問題