2012-08-22 21 views
17

Come posso modificare la data, l'ora e il fuso orario del sistema in Python? C'è qualche modulo disponibile per questo?Modulo Python per modificare la data e l'ora del sistema

  1. Non voglio eseguire qualsiasi sistema di comandi
  2. voglio una soluzione comune, che dovrebbe funzionare sia su Unix e Windows.
+0

controllare fuori >> http://docs.python.org/library/ datetime.html – Hamoudaq

+0

Dati i permessi di sistema e l'autenticazione, questo è più difficile da fare di quanto si pensi sia per Unix che per Windows. –

+0

@EngHamoud, non penso che il modulo 'datetime' possa impostare l'ora del sistema. Ecco alcuni modi per farlo in [Windows] (http://stackoverflow.com/questions/3281254/setting-the-system-date-in-python-on-windows) e [Linux] (http: // stackoverflow .com/domande/2193964/set-the-hardware-orologio-in-python). –

risposta

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) 

Non ho una macchina Windows, quindi non l'ho testata su Windows ... Ma tu hai capito.

+0

nota che è necessario installare pywin32 affinché funzioni ... – 576i

+1

Usa 'se sys.platform.startswith ('linux')' per lavorare con Python> = 3.3. –

+0

Per la risposta di @jk987, il nome corretto del modulo è 'win32api', non' pywin32'. Inoltre, 'SetSystemTime' richiede 8 argomenti; si potrebbe aggiungere '' ', oppure si potrebbe fare' remote_time = datetime.datetime.fromtimestamp (response.tx_time) + datetime.datetime.utcnow() - datetime.datetime.now() 'e quindi' win32api.SetSystemTime (remote_time .anno, remote_time.month, remote_time.isoweekday(), remote_time.day, remote_time.hour, remote_time.minute, remote_time.second, remote_time.microsecond // 1000) '. – wecsam

-1

bene per ora penso che questo sia la soluzione migliore

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' 

per ora è una soluzione temporanea, speriamo che sia utile, aslo un'occhiata

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

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

+0

win32api.setSystemTime funziona per me ... –

+0

e data di comando per Linux? anche glade a sentire che – Hamoudaq

+1

Questo naturalmente crea un sottoprocesso per eseguire il comando di sistema 'date' se il sistema è Linux. Qualcosa che l'OP non vuole fare. – tMC

4

ho dovuto modificare la versione win32 di risposta po 'TMC:

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) 

Eg. quando lo uso per impostare l'ora in base al vecchio assistente di tempo (Time Protocol, RFC868) lo sto facendo aproximately questo modo:

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

mancati 'dall'importazione datetime datetime' altrimenti funzionante dopo l'installazione di pywin32 – 576i

Problemi correlati