2012-08-25 9 views
6

यूटीसी डेटाटाइम रूपांतरणों के बारे में कई सवाल हैं और ऐसा लगता है कि "सर्वश्रेष्ठ तरीका" की सर्वसम्मति नहीं है।पाइथन के साथ, यूटीसी डेटाटाइम कैसे लें, उपयोगकर्ताओं को समय-समय पर ऑटोडेट करें, और डेटाटाइम को वांछित प्रारूप में कनवर्ट करें?

इस के अनुसार: 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 नहीं है"

हर कोई मैं देख रहा हूँ पीईटीजेड का उपयोग करके अपना टाइमज़ोन (users_timezone = timezone("US/Pacific")) की आपूर्ति कर रहा है, जिसे मैं समझ नहीं पा रहा हूं क्योंकि आप नहीं जानते कि आपका दर्शक कहां है ...

यह लड़का https://stackoverflow.com/a/4771733/523051 टाइमज़ोन को स्वतः पहचानने का एक तरीका है, लेकिन यह dateutil लाइब्रेरी का उपयोग कर रहा है, और pytz नहीं, जैसा कि अरमीन रोनाकर दोनों द्वारा अनुशंसित किया गया है और आधिकारिक पायथन दस्तावेज़ (http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, पीले रंग के बॉक्स में एंकर से ऊपर)

मुझे बस इतना ही सरल, भविष्य-सबूत, सभी डेलाइट बचत समय/आदि की आवश्यकता है, जो मेरे डेटाटाइम लेने के लिए विचार किया जाता है .utcnow() टिकट (2012-08-25 10:59:56.511479), इसे उपयोगकर्ता के टाइमज़ोन रूपांतरित करें। और यह इस तरह दिखाने:

Aug 25 - 10:59AM 

और अगर साल चालू वर्ष नहीं है, मैं चाहता हूँ

Aug 25 '11 - 10:59AM 

उत्तर

3

ठीक है, यहाँ यह है (यह भी, मेरी पहली योगदान इतना करने के लिए कहने के लिए:))

यह 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 
+0

मैं सीख लिया है कि tzlocal() बिल्कुल पर काम नहीं करता Heroku। उपरोक्त फ़ंक्शन बस यूटीसी समय देता है। – chrickso

+0

यह भी ध्यान दें, मैंने सभी उम्मीदों को खो दिया है कि उपयोगकर्ता के टाइमज़ोन को सटीक रूप से निर्धारित करने और स्वचालित रूप से समय समायोजित करने का उनका एक विश्वसनीय तरीका है। मैं देखता हूं कि ट्विटर के पास आपके टाइमज़ोन को समायोजित करने की सेटिंग है, इसलिए यह तरीका होना चाहिए: उपयोगकर्ता की वरीयता संग्रह करें और रूपांतरणों के लिए इसका उपयोग करें। – chrickso

संबंधित मुद्दे