2012-08-25 12 views
6

UTC datetime dönüşümleri hakkında bir sürü soru var ve "en iyi yol" konusunda bir fikir birliği yok gibi görünüyor.Python ile UTC tarihini nasıl alabilirim, kullanıcıları otomatik algılama saat dilimi ve datetime öğesini istediğiniz biçime dönüştürmek nasıl?

Buna göre: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, pytz gitmek için en iyi yoldur.

Herkes görüyorum "replace değil, localize Yaz Saati için ayarlar"

Bu adam https://stackoverflow.com/a/7465359/523051 diyor ... bu datetime.datetime.utcnow().replace(tzinfo=pytz.utc) gibi bir saat dilimine göre dönüştürerek gösterir ama o kullanıcının dilimini nasıl söylemez kullanarak pytz Görüntüleyeninizin olduğu bu olmadığını biliyor olamaz çünkü anlamıyorum kendi zaman dilimini (users_timezone = timezone("US/Pacific")), ... tedarik edilir

Bu adam https://stackoverflow.com/a/4771733/523051 saat dilimleri otomatik olarak algılamaya bir yolu vardır, ancak Bu, Armin Ronacher tarafından önerildiği gibi, pytz değil dateutil kütüphanesini kullanıyor ve (sadece sarı kutudaki o çapa yukarıdaki http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior) resmi piton docs

Ben en çok basit, geleceğe, bütün yaz saati/vb (benim datetime.utcnow() damgası girdikleri kabul yoludur gereken tek şey 2012-08-25 10:59:56.511479), kullanıcının saat dilimini dönüştürün.

Aug 25 - 10:59AM 

ve yılı cari yıl değilse, İsterdim

Aug 25 '11 - 10:59AM 

cevap

3

tamam, işte burada (aynı zamanda benim ilk katkı SO söylemek: Ve şöyle gösterir:)) ben tzlocal() hiç çalışmaz öğrendik

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

bazı kapalı atmak olabilir 2 harici kütüphaneleri gerektirir ... Heroku. Yukarıdaki fonksiyon sadece UTC zamanını döndürür. – chrickso

+0

Ayrıca, bir kullanıcının saat dilimini doğru bir şekilde belirlemenin ve zamanları otomatik olarak ayarlamanın güvenilir bir yol olduğuna dair tüm umudumu kaybettim. twitter'in saat diliminizi ayarlamaya yönelik bir ayarı olduğunu görüyorum, bu yüzden şu şekilde olmalıdır: kullanıcının tercihini saklayın ve bunu dönüşümler için kullanın. – chrickso