2012-08-25 10 views
6

Es gibt eine Menge Fragen zu UTC-Datetime-Conversions und es scheint keinen Konsens zu geben, der "der beste Weg" ist.Wie, mit Python, eine UTC-Datetime, automatische Erkennung der Zeitzone des Benutzers, und konvertiert die Datetime in das gewünschte Format?

Nach diesem: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, Pytz ist der beste Weg zu gehen. er zeigt die Umwandlung wie diese datetime.datetime.utcnow().replace(tzinfo=pytz.utc) zu Zeitzone, aber er sagt nicht, wie die Benutzer-Zeitzone zu erhalten ...

Dieser Typ https://stackoverflow.com/a/7465359/523051 sagt „localize für die Sommerzeit einstellt, replace nicht“

Jeder, den ich sehen mit Pytz liefert ihre eigene Zeitzone (users_timezone = timezone("US/Pacific")), die ich nicht verstehe, weil Sie nicht wissen können, ob das ist, wo Ihr Betrachter ist ...

Dieser Typ https://stackoverflow.com/a/4771733/523051 hat eine Möglichkeit, die Zeitzonen automatisch zu erkennen, aber Dies ist mit der dateutil Bibliothek und nicht Pytz, wie von Armin Ronacher empfohlen und die offizielle Python-Dokumentation (http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, genau darüber in gelbem Kasten)

Alles, was ich brauche, ist die einfachste, zukunftssichere, alle Sommerzeit/etc berücksichtigt Weg, um meine datetime.utcnow() Stempel (2012-08-25 10:59:56.511479), wandeln Sie die Zeitzone des Benutzers um. Und zeigen sie dies wie:

Aug 25 - 10:59AM 

und wenn das Jahr nicht das aktuelle Jahr, würde Ich mag

Aug 25 '11 - 10:59AM 

Antwort

3

in Ordnung sagen, hier ist es (auch, mein erster Beitrag zu SO:))

es erfordert 2 externe Bibliotheken, die etwas abwerfen kann ...

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

ich gelernt habe, dass die tzlocal() gar nicht auf nicht funktioniert heroku. Die obige Funktion gibt einfach die UTC-Zeit zurück. – chrickso

+0

auch beachten Sie, ich habe alle Hoffnung verloren, dass sie eine zuverlässige Möglichkeit ist, die Zeitzone eines Benutzers genau zu bestimmen und Zeiten automatisch anzupassen. Ich sehe, dass Twitter eine Einstellung hat, um Ihre Zeitzone anzupassen, so dass dies der Weg sein muss: speichern Sie Benutzereinstellungen und verwenden Sie diese für Conversions. – chrickso