2010-12-05 3 views
7

जब पाइथन विंडोज के तहत चल रहा है, तो समय। लॉकटाइम सही समय की रिपोर्ट नहीं करता है यदि पायथन उदाहरण के जीवनकाल के दौरान टाइमज़ोन बदल जाता है। लिनक्स के तहत, टाइम.tzset हमेशा इस तरह की समस्याओं को कम करने के लिए चलाया जा सकता है, लेकिन ऐसा लगता है कि विंडोज़ में कोई समकक्ष नहीं है।विंडोज टाइमज़ोन परिवर्तनों के लिए पाइथन प्रतिक्रिया दें

वहाँ कुछ बेतुका की तरह, ओह, मैं नहीं जानता कि ऐसा किए बिना इसे ठीक करने का कोई तरीका है ...

#!/bin/env python 
real_localtime = eval(subprocess.Popen(
    ["python","-c", "import time;repr(time.localtime())"], 
    stdout=subprocess.PIPE).communicate()[0]) 
+1

मैं इसकी पुष्टि कर सकता हूं, मुझे एक बग जैसा दिखता है। – AndiDog

+1

eval आवश्यक क्यों है? –

+0

@ रैफ क्यों eval आवश्यक नहीं होगा? मैं एक टपल चाहता हूं कि मैं एक स्ट्रिंग के साथ काम कर सकता हूं। –

उत्तर

4

एक और तर्कसंगत समाधान है कि कर्नेल 32 के GetLocalTime को pywin32 या ctypes के साथ उपयोग करना है। किसी भी समय क्षेत्र परिवर्तन तुरंत परिलक्षित होते हैं।

import ctypes 
class SYSTEMTIME(ctypes.Structure): 
    _fields_ = [ 
     ('wYear', ctypes.c_int16), 
     ('wMonth', ctypes.c_int16), 
     ('wDayOfWeek', ctypes.c_int16), 
     ('wDay', ctypes.c_int16), 
     ('wHour', ctypes.c_int16), 
     ('wMinute', ctypes.c_int16), 
     ('wSecond', ctypes.c_int16), 
     ('wMilliseconds', ctypes.c_int16)] 

SystemTime = SYSTEMTIME() 
lpSystemTime = ctypes.pointer(SystemTime) 
ctypes.windll.kernel32.GetLocalTime(lpSystemTime) 
print SystemTime.wHour, SystemTime.wMinute 
3

नहीं है, आप ऐसा करते समय क्या किया बिना तय नहीं किया जा सकता है। यह थोड़ा बेतुका है, लेकिन यदि आपको विंडोज़ में सही समय क्षेत्र की आवश्यकता है और यह प्रोग्राम के निष्पादन के दौरान बदल गया है, तो यह किया जाना चाहिए।

यह शायद एक बग नहीं है (दस्तावेज़ीकरण बहुत स्पष्ट है कि tzset() फ़ंक्शन केवल यूनिक्स पर उपलब्ध है)। विंडोज़ में यह एक कमजोरी है जो पाइथन प्रोग्रामर को tzset() को लागू करने से रोकती है। आप फीचर एन्हांसमेंट के लिए अनुरोध कर सकते हैं, लेकिन यह पाइथन 2.3 (7 साल) के बाद से इस तरह से किया गया है, इसलिए यह वास्तव में लागू नहीं होगा।

+0

एक फीचर अनुरोध मुझे व्यक्तिगत रूप से बहुत अच्छा नहीं करेगा क्योंकि मैं अभी भी 2.X का उपयोग करता हूं, लेकिन मुझे लगता है कि मैं बाद में किसी को नरक छोड़ सकता हूं। क्या बिल्टिन मॉड्यूल पर काम करने के लिए रीलोड फ़ंक्शन प्राप्त करने का कोई तरीका है? मैंने कोशिश की "डेल टाइम; डेल sys.modules ['time']" इस तरह की किस्मत के साथ जब सादा पुराना रीलोड फ़ंक्शन काम नहीं करता था। –

+0

@EricPruitt शायद नहीं, अगर आपने पुनः लोड करने के "सामान्य" तरीके की कोशिश की है। आपका समाधान थोड़ा सा है, लेकिन इसे –

+0

पर काम करना होगा, मुझे लगता है कि मैं ctypes या pywin32 का उपयोग करूंगा और [Kernel32.lib's GetLocalTime] का उपयोग करने का प्रयास करूंगा (http://msdn.microsoft.com/en-us/library /ms724338%28v=VS.85%29.aspx)। –

3

लब्बोलुआब यह है कि 6 ver कुलपति के साथ, tzset() ठीक से काम नहीं करता है। हालांकि वीसी वर्क 8 tzset() अब काम करता है (मुझे लगता है कि यह 7 में भी काम कर रहा है, लेकिन मेरे पास उस संस्करण को जांचने के लिए नहीं है)।

तो अब ऐसा होना चाहिए कि स्रोत कोड में HAVE_WORKING_TZSET सक्षम करें और पुन: संकलित करें (और परीक्षण)।

मेरे अनुभव में, टीजेड की विभिन्न सेटिंग्स के लिए कार्यों की सभी ज़रूरतों को एक काम करने वाला tzset() होना चाहिए। जब भी आप सी लैंग टीजेड var -or- Windows TIME_ZONE_INFORMATION बदलते हैं तो आपको tzset() को कॉल करना होगा। वीसी वर्क 6 में यह संभव नहीं था और यही कारण है कि HAVE_WORKING_TZSET सक्षम नहीं है (लेकिन अब कम से कम वीसी वर्क 8 और ऊपर होना चाहिए)।

बीटीडब्ल्यू। मेरे द्वारा की जाने वाली सभी दिनांक/समय सामग्री के लिए, मेरे पास हमेशा एक SetUtcTime() और UnsetUtcTime() है जो टीजेड को जीएमटी में सेट करता है और तदनुसार tzset() को कॉल करता है। मेरे पास फ़ंक्शन को अन्य टाइमज़ोन पर सेट करने के लिए भी कार्य करता है। यह ठीक से करने का एकमात्र तरीका है! कई वर्षों के अनुभव में, मैं कह सकता हूं कि कुछ भी परेशानी है। और calendar.timegm() सही नहीं है। Tzset() का प्रयोग करें।

(मैं किसी अन्य कंप्यूटर से इस टाइप किया, इसलिए उम्मीद है कोई वर्तनी त्रुटियों, लेकिन यह मुद्दा यह है कि मैं बना रही है:

यहाँ सबूत यह अब काम कर रहा है (इसलिए बग लेखक जाना खिड़कियों कोड तय करने के लिए) है कोड नहीं)।


नोट: सभी को नीचे अजगर नोट (मैं अजगर के CTYPE इंटरफ़ेस से सी लैंग बोल रहा हूँ) है: क्योंकि मैं यहाँ DLL सीमा के माध्यम से TZ की स्थापना कर रहा हूँ और स्थानीय थ्रेड और सभी कि बकवास, यह के रूप में इस्तेमाल नहीं किया जा सकता एक काम के आसपास। HAVE_WORKING_TZSET को पुन: सक्षम करना होगा।

import time 
from ctypes import * 

dTime = time.time() 
nTime = int (dTime) 
intTime = c_int (nTime) 

print time.ctime (dTime) 
print c_char_p (cdll.msvcrt.ctime (addressof (intTime))).value 

-> ... 21:02:40 ... (अजगर)
-> ... 21:02:40 ...(सी लैंग)

cdll.msvcrt._putenv ('TZ=GMT') 
cdll.msvcrt._tzset() 

(सामान्य रूप से time.tzset() कहा जा सकता है और यह भी बुला inittimezone() अजगर के समय क्षेत्र के साथ-साथ चर अद्यतन करने के लिए)

print time.ctime (dTime) 
print c_char_p (cdll.msvcrt.ctime (addressof (intTime))).value 

-> ... 21: 02:40 ... (पायथन)
-> ... 11:02:40 ... (सी लैंग) < - अंतर्निहित वीसी वर्क 8 अब काम कर रहा है!

(इसलिए यदि HAVE_WORKING_TZSET (8 ver और ऊपर) के लिए आप मिलेगा इस :)

परिभाषित -> ... 11:02:40 ... (अजगर)
-> ... 11 : 02: 40 ... (सी लैंग)


बस को देखने के लिए मैं क्या मतलब है स्रोत कोड की जाँच करें।

मैंने इसे नवीनतम पायथन '2.0' श्रृंखला के साथ चेक किया: 2.7.2 अभी।