2012-08-22 5 views
17

मैं पाइथन में सिस्टम दिनांक, समय, टाइमज़ोन कैसे बदल सकता हूं? क्या इसके लिए कोई मॉड्यूल उपलब्ध है?सिस्टम दिनांक और समय बदलने के लिए पायथन मॉड्यूल

  1. मैं किसी भी प्रणाली पर अमल नहीं करना चाहती आदेश
  2. मैं एक आम समाधान, जो दोनों यूनिक्स और विंडोज पर काम करना चाहिए चाहते हैं।
+0

यह बाहर की जाँच >> http://docs.python.org/library/: जब मैं पुराने समय सर्वर (टाइम प्रोटोकॉल, RFC868) के अनुसार इसका इस्तेमाल समय निर्धारित करने की मैं इसे लगभग इस तरह से कर रहा हूँ datetime.html – Hamoudaq

+0

सिस्टम अनुमतियों और प्रमाणीकरण को देखते हुए, यूनिक्स और विंडोज दोनों के लिए आपको लगता है कि यह करना मुश्किल है। –

+0

@EngHamoud, मुझे नहीं लगता कि 'डेटाटाइम' मॉड्यूल सिस्टम समय निर्धारित कर सकता है। [विंडोज] में ऐसा करने के कुछ तरीके यहां दिए गए हैं (http://stackoverflow.com/questions/3281254/setting-the-system-date-in-python-on-windows) और [लिनक्स] (http: // stackoverflow .com/प्रश्न/2193964/सेट-हार्डवेयर-घड़ी में अजगर)। –

उत्तर

26
ले है
import sys 
import datetime 

time_tuple = (2012, # Year 
        9, # Month 
        6, # Day 
        0, # Hour 
       38, # Minute 
        0, # Second 
        0, # Millisecond 
      ) 

def _win_set_time(time_tuple): 
    import pywin32 
    # http://timgolden.me.uk/pywin32-docs/win32api__SetSystemTime_meth.html 
    # pywin32.SetSystemTime(year, month , dayOfWeek , day , hour , minute , second , millseconds) 
    dayOfWeek = datetime.datetime(time_tuple).isocalendar()[2] 
    pywin32.SetSystemTime(time_tuple[:2] + (dayOfWeek,) + time_tuple[2:]) 


def _linux_set_time(time_tuple): 
    import ctypes 
    import ctypes.util 
    import time 

    # /usr/include/linux/time.h: 
    # 
    # define CLOCK_REALTIME      0 
    CLOCK_REALTIME = 0 

    # /usr/include/time.h 
    # 
    # struct timespec 
    # { 
    # __time_t tv_sec;   /* Seconds. */ 
    # long int tv_nsec;   /* Nanoseconds. */ 
    # }; 
    class timespec(ctypes.Structure): 
     _fields_ = [("tv_sec", ctypes.c_long), 
        ("tv_nsec", ctypes.c_long)] 

    librt = ctypes.CDLL(ctypes.util.find_library("rt")) 

    ts = timespec() 
    ts.tv_sec = int(time.mktime(datetime.datetime(*time_tuple[:6]).timetuple())) 
    ts.tv_nsec = time_tuple[6] * 1000000 # Millisecond to nanosecond 

    # http://linux.die.net/man/3/clock_settime 
    librt.clock_settime(CLOCK_REALTIME, ctypes.byref(ts)) 


if sys.platform=='linux2': 
    _linux_set_time(time_tuple) 

elif sys.platform=='win32': 
    _win_set_time(time_tuple) 

मेरे पास विंडोज़ मशीन नहीं है इसलिए मैंने विंडोज़ पर इसका परीक्षण नहीं किया ... लेकिन आपको यह विचार मिलता है।

def _win_set_time(time_tuple): 
    import win32api 
    dayOfWeek = datetime(*time_tuple).isocalendar()[2] 
    t = time_tuple[:2] + (dayOfWeek,) + time_tuple[2:] 
    win32api.SetSystemTime(*t) 

उदाहरण के लिए:

+0

ध्यान दें कि आपको काम करने के लिए pywin32 इंस्टॉल करने की आवश्यकता है .... – 576i

+1

पायथन> = 3.3 के साथ काम करने के लिए 'sy syplplatform.startswith (' linux ')' का प्रयोग करें। –

+0

प्रति @ jk987 के उत्तर, सही मॉड्यूल नाम 'win32api' है, न कि' pywin32'। साथ ही, 'सेटसिस्टमटाइम' में 8 तर्क होते हैं; आप '*' जोड़ सकते हैं, या आप 'remote_time = datetime.datetime.fromtimestamp (respond.tx_time) + datetime.datetime.utcnow() - datetime.datetime.now() 'और फिर' win32api.SetSystemTime (remote_time 'कर सकते हैं .year, remote_time.month, remote_time.isoweekday(), remote_time.day, remote_time.hour, remote_time.minute, remote_time.second, remote_time.microsecond // 1000) '। – wecsam

-1
अच्छी तरह से अब के लिए

मुझे लगता है कि यह अभी के लिए सबसे अच्छा समाधान

import sys,os 
def change(s): 
    if s == 1:os.system('date -s "2 OCT 2006 18:00:00"')#don't forget to change it , i've used date command for linux 
    elif s == 2: 
     try: 
      import pywin32 
     except ImportError: 
      print 'pywin32 module is missing' 
      sys.exit(1) 
     pywin32.SetSystemTime(year, month , dayOfWeek , day , hour , minute , second , millseconds)# fill all Parameters with int numbers 
    else:print 'wrong param' 
def check_os(): 
    if sys.platform=='linux2':change(1) 
    elif sys.platform=='win32':change(2) 
    else:print 'unknown system' 

है यह अस्थायी समाधान, उम्मीद है कि यह उपयोगी है, भी है एक नज़र

http://timgolden.me.uk/pywin32-docs/win32api__SetSystemTime_meth.html

http://timgolden.me.uk/pywin32-docs/win32api__SetLocalTime_meth.html

+0

win32api.setSystemTime मेरे लिए काम करता है ... –

+0

और लिनक्स के लिए डेट कमांड? यह भी सुनने के लिए glade कि – Hamoudaq

+1

यह सिस्टम निश्चित रूप से 'डेट' सिस्टम कमांड चलाने के लिए उपप्रोसेस बनाता है यदि सिस्टम लिनक्स है। ओपी कुछ नहीं करना चाहता है। – tMC

4

मैं टीएमसी के जवाब छोटा सा की Win32 संस्करण को संशोधित करने के लिए किया था।

data = s.recv(4) 
remote_time = (ord(data[0])<<24) + (ord(data[1])<<16) + (ord(data[2])<<8) + ord(data[3]) 
remote_time -= 2208988800 
_win_set_time(time.gmtime(remote_time)[0:6] + (0,)) 
+1

'टाइमटाइम आयात डेटाटाइम से' याद करता है अन्यथा pywin32 इंस्टॉल करने के बाद काम करना – 576i