2012-09-27 12 views
35

पर लागू नहीं किया जा सकता है मेरे पास एक तिथि है और मुझे इसे समय क्षेत्र को जागरूक करने की आवश्यकता है।pytz और astimezone() को एक बेवकूफ डेटाटाइम

local_tz = timezone('Asia/Tokyo') 
start_date = '2012-09-27' 
start_date = datetime.strptime(start_date, "%Y-%m-%d") 
start_date = start_date.astimezone(local_tz) 


now_utc = datetime.now(timezone('UTC')) 
local_now = now_utc.astimezone(local_tz) 

मैं अगर यह सच है खोजने की जरूरत है:

print start_date>local_now 

लेकिन मैं इस त्रुटि मिलती है।

start_date = start_date.astimezone(local_tz) 
    ValueError: astimezone() cannot be applied to a naive datetime 

मैं यूटीसी को टोक्यो को बिना किसी समस्या के रूपांतरित करता हूं। मुझे टोक्यो में start_date टाइमज़ोन जागरूक विज्ञापन को अच्छी तरह से बनाना होगा।

धन्यवाद

उत्तर

34

pytz समय-क्षेत्रों के लिए, एक समय क्षेत्र के साथ एक में एक अनुभवहीन datetime वस्तु चालू करने के लिए उनके .localize() विधि का उपयोग करें:

start_date = local_tz.localize(start_date) 
एक डीएसटी संक्रमण के बिना

समय-क्षेत्रों के लिए, .replace() method करने के लिए एक समय क्षेत्र संलग्न करने के लिए एक अनुभवहीन datetime वस्तु सामान्य रूप से भी काम करना चाहिए:

start_date = start_date.replace(tzinfo=local_tz) 

अधिक जानकारी के लिए pytz दस्तावेज़ीकरण के localized times and date arithmetic देखें।

+6

[pytz docs] (http://pytz.sourceforge.net/) का कहना है कि tzinfo विशेषता का उपयोग करना कई टाइमज़ोन के लिए सीधे विफल रहता है। इसके बजाय tz.localize() का उपयोग किया जाना चाहिए। – jfs

+0

@JFSebastian यह एक अच्छा उदाहरण है कि यह कितनी बुरी तरह विफल हो सकता है http://stackoverflow.com/questions/11442183/pytz-timezone-shows-weird-results-for-asia-calcutta और ध्यान दें कि इसमें कुछ भी नहीं है डीएसटी के साथ। –

+0

@ जेएफ। सेबेस्टियन: दिलचस्प। उत्तर अपडेट किया गया। –

11

आप एक निष्क्रिय डेटाटाइम ऑब्जेक्ट को टाइमज़ोन-जागरूक में परिवर्तित करने के लिए local_tz.localize(naive_dt, is_dst=None) का उपयोग कर सकते हैं।

from datetime import datetime 
import pytz 

local_tz = pytz.timezone('Asia/Tokyo') 

start_date = local_tz.localize(datetime(2012, 9, 27), is_dst=None) 
now_utc = datetime.utcnow().replace(tzinfo=pytz.utc) 

print start_date > now_utc 

is_dst=None बलों .localize() यदि दिए गए स्थानीय समय अस्पष्ट है एक अपवाद को बढ़ाने के लिए।

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