2012-08-22 13 views
17

¿Cómo puedo cambiar la fecha, hora y zona horaria del sistema en Python? ¿Hay algún módulo disponible para esto?Módulo de Python para cambiar la fecha y hora del sistema

  1. no quiero para ejecutar cualquier sistema de comandos
  2. Quiero una solución común, que debe trabajar tanto en Unix y Windows.
+0

comprobar que funciona >> http://docs.python.org/library/ datetime.html – Hamoudaq

+0

Dados los permisos del sistema y la autenticación, esto es más difícil de hacer de lo que piensas tanto para Unix como para Windows. –

+0

@EngHamoud, no creo que el módulo 'datetime' pueda establecer la hora del sistema. Aquí hay algunas maneras de hacerlo en [Windows] (http://stackoverflow.com/questions/3281254/setting-the-system-date-in-python-on-windows) y [Linux] (http: // stackoverflow .com/questions/2193964/set-the-hardware-clock-in-python). –

Respuesta

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) 

No tengo una máquina de Windows, así que no la probé en Windows ... Pero ya entendiste la idea.

+0

tenga en cuenta que debe instalar pywin32 para que esto funcione ... – 576i

+1

Use 'if sys.platform.startswith ('linux')' para trabajar con Python> = 3.3. –

+0

Por respuesta de @jk987, el nombre del módulo correcto es 'win32api', no' pywin32'. Además, 'SetSystemTime' toma 8 argumentos; podría agregar el '*', o podría hacer 'remote_time = datetime.datetime.fromtimestamp (response.tx_time) + datetime.datetime.utcnow() - datetime.datetime.now()' y luego '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

bien por ahora creo que esta es la mejor solución

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' 

por ahora es una solución temporal, esperamos que sea útil, aslo echar un vistazo

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

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

+0

win32api.setSystemTime funciona para mí ... –

+0

y el comando date para Linux? También claro para escuchar que – Hamoudaq

+1

Esto hace por supuesto crear un subproceso para ejecutar el comando 'date' system si el sistema es linux. Algo que el OP no quiere hacer. – tMC

4

tuve que modificar la versión Win32 de respuesta poco de 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) 

Ej. cuando lo uso para ajustar el tiempo de acuerdo con servidor de hora de edad (Protocolo de tiempo, RFC868) lo estoy haciendo visita aproximado de esta manera:

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

falta 'from datetime import datetime' de lo contrario funciona después de instalar pywin32 – 576i

Cuestiones relacionadas