2010-04-05 11 views
6

मैं निम्नलिखित कार्यों का उपयोग कर रहा:पायथन 3: टाइमटाइम डेटाटाइम: यह अतिरिक्त घंटा कहां से आता है?

# The epoch used in the datetime API. 
EPOCH = datetime.datetime.fromtimestamp(0) 

def timedelta_to_seconds(delta): 
    seconds = (delta.microseconds * 1e6) + delta.seconds + (delta.days * 86400) 
    seconds = abs(seconds) 

    return seconds 

def datetime_to_timestamp(date, epoch=EPOCH): 
    # Ensure we deal with `datetime`s. 
    date = datetime.datetime.fromordinal(date.toordinal()) 
    epoch = datetime.datetime.fromordinal(epoch.toordinal()) 

    timedelta = date - epoch 
    timestamp = timedelta_to_seconds(timedelta) 

    return timestamp 

def timestamp_to_datetime(timestamp, epoch=EPOCH): 
    # Ensure we deal with a `datetime`. 
    epoch = datetime.datetime.fromordinal(epoch.toordinal()) 

    epoch_difference = timedelta_to_seconds(epoch - EPOCH) 
    adjusted_timestamp = timestamp - epoch_difference 

    date = datetime.datetime.fromtimestamp(adjusted_timestamp) 

    return date 

और उन्हें पारित किया कोड के साथ प्रयोग:

twenty = datetime.datetime(2010, 4, 4) 

print(twenty) 
print(datetime_to_timestamp(twenty)) 
print(timestamp_to_datetime(datetime_to_timestamp(twenty))) 

और निम्न परिणाम हो रही है:

2010-04-04 00:00:00 
1270339200.0 
2010-04-04 01:00:00 

किसी कारण के लिए, मैं मुझे अपने कोड के बावजूद, अतिरिक्त घंटे अंतिम कॉल में जोड़ा गया है, जहां तक ​​मैं देख सकता हूं, कोई दोष नहीं है।

यह अतिरिक्त घंटा कहां से आ रहा है?

+0

क्या यह ब्रिटिश ग्रीष्मकालीन समय है? – msw

+0

@msw क्या यह टाइमज़ोन के बारे में एक छिपी हुई संकेत है? ...यह लगभग एक हफ्ते पहले शुरू हुआ था, लेकिन मुझे नहीं पता कि मेरे कोड में यह टाइमज़ोन जानकारी को संभालता है या अभिनय करने के विरोध में भद्दा कार्य करता है? –

+1

हाँ, यह एक संकेत था, क्योंकि मुझे एक ही परिणाम मिलते हैं और दिन के समय पर भी (पायथन 2.6 में) हैं। मैं अब भगवान-भयानक datetime.tzinfo ऑपरेशन के माध्यम से उलझ रहा हूं, जबकि मैं दुनिया के लिए http://en.wikipedia.org/wiki/Swatch_Internet_Time – msw

उत्तर

4
# Ensure we deal with `datetime`s. 
date = datetime.datetime.fromordinal(date.toordinal()) 

, (उस समय के- छुट्टी का दिन काटना है पूरी तरह से, के रूप में 'क्रमसूचक' दिन में केवल एक संख्या है। है कि आप क्या करना मतलब? मैं नहीं संदेह है।)

वैसे भी माइकल के रूप में ने कहा, datetime.fromtimestamp आपको उस पॉज़िक्स (यूटीसी) टाइमस्टैम्प के लिए स्थानीय समय के साथ एक भयानक डेटाटाइम देता है। तो जब आप कहते हैं -

date = datetime.datetime.fromtimestamp(adjusted_timestamp) 

आप POSIX टाइमस्टैम्प 2010-04-04T00 का प्रतिनिधित्व करने के लिए स्थानीय समय हो रही है: 00: 00 है, जो BST में निश्चित रूप से आगे एक घंटे है। यह वापसी की दिशा में नहीं होता है क्योंकि आपका युग जनवरी में है, जब बीएसटी लागू नहीं है। (हालांकि EPOCH पूरी तरह से बंद हो जाएगा यदि आप यूके में नहीं थे।)

आपको datetime.fromtimestamp के datetime.utcfromtimestamp के साथ अपने दोनों उपयोगों को प्रतिस्थापित करना चाहिए।

यह दुख की बात है कि datetime स्थानीय समय में समय रखने की भयानक time परंपरा जारी है। उन्हें 'भद्दा' कहकर और डीएसटी ध्वज को दूर करने से उन्हें और भी बदतर बना दिया जाता है। व्यक्तिगत रूप से मैं datetime का उपयोग करने के लिए खड़ा नहीं हो सकता, सबकुछ के लिए पूर्णांक यूटीसी टाइमस्टैम्प पसंद करता हूं (केवल प्रारूपण के लिए स्थानीय टाइमज़ोन में कनवर्ट करना)।

+0

पायथन की डेट-टाइम एपीआई ने मुझे फिर से इसका उपयोग करने से डर दिया है ... –

1

आपकी प्रोफ़ाइल के आधार पर, आप ब्रिटेन में हैं। इसका मतलब है कि आप वर्तमान में डीएसटी के कारण यूटीसी + 1 पर चल रहे हैं।

अगर मैं अपने टाइमस्टैम्प लेने के लिए और अजगर 2.6 पर datetime.fromtimestamp के माध्यम से इसे चलाने के (मैं तुम्हें अजगर 3 का उपयोग पता है, लेकिन यह है कि मैं क्या है), जो मुझे पता चलता है कि यह मानना ​​है कि यह 2010-04-04 02 को संदर्भित करता है : 00: 00 - और मैं सीईएसटी में हूं, इसलिए यह यूटीसी + 2 है।

रनटाइम.फॉम्टेमिस्टैम्प (0) चल रहा है, मुझे लगता है कि युग 1 9 70-01-01 01:00:00 है। यह तब मुझे दिखाता है कि यह सही ढंग से केवल एक घंटा जोड़ रहा है (1 जनवरी से डीएसटी के बाहर है, और युग उस तारीख को आधी रात यूटीसी है, यह 01:00 होगा)।

दूसरे शब्दों में, आपकी समस्या यह है कि आप उस समय में भेज रहे हैं जिसमें डीएसटी लागू है, लेकिन datetime_to_timestamp इसका व्यवहार करता है जैसे कि डीएसटी मौजूद नहीं था। timestamp_to_datetime, हालांकि, डीएसटी लागू होता है।

दुर्भाग्यवश, मुझे यह जानने के लिए पर्याप्त पायथन नहीं पता कि आप इसे कैसे हल करेंगे, लेकिन इससे आपको कम से कम कुछ देना चाहिए।

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