6

UTC 日時変換については多くの質問があり、「最善の方法」についてのコンセンサスはないようです。

これによると:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/、pytzが最善の方法です。彼はこのようにタイムゾーンに変換することを示してdatetime.datetime.utcnow().replace(tzinfo=pytz.utc)いますが、ユーザーのタイムゾーンを取得する方法については述べていません...

この男https://stackoverflow.com/a/7465359/523051は、「localize夏時間に合わせて調整しますが、調整しreplaceません」と言います

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私が必要とするのは、datetime.utcnow() スタンプ ( ) を取得し、それをユーザーのタイムゾーンに変換する最も簡単で、将来性があり、すべての夏時間などを考慮した方法だけです。そして、次のように示します。

Aug 25 - 10:59AM

その年が現在の年でない場合は、

Aug 25 '11 - 10:59AM
4

1 に答える 1

4

わかりました、ここにあります(また、SOへの私の最初の貢献:))

2つの外部ライブラリが必要なため、一部が失敗する可能性があります...

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
于 2012-08-25T13:55:19.033 に答える