2012-08-22 7 views
17

Jak zmienić datę systemową, godzinę, strefę czasową w Pythonie? Czy jest dostępny jakiś moduł?Moduł Pythona do zmiany daty i czasu systemu

  1. Nie chcę, aby wykonać dowolny system poleceń
  2. Chcę jedno wspólne rozwiązanie, które powinny pracować na obu Unix i Windows.
+0

to sprawdzić >> http://docs.python.org/library/ datetime.html – Hamoudaq

+0

Biorąc pod uwagę uprawnienia systemowe i uwierzytelnianie, jest to trudniejsze niż myślisz zarówno dla systemów Unix, jak i Windows. –

+0

@EngHamoud, Nie sądzę, że moduł 'datetime' może ustawić czas systemowy. Oto kilka sposobów, aby to zrobić w [Windows] (http://stackoverflow.com/questions/3281254/setting-the-system-date-in-python-on-windows) i [Linux] (http: // stackoverflow .com/questions/2193964/set-the-hardware-clock-in-python). –

Odpowiedz

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) 

Nie mam maszyny Windows, więc nie testowałem jej w systemie Windows ... Ale masz pomysł.

+0

Zauważ, że musisz zainstalować pywin32, aby to działało .... – 576i

+1

Użyj 'if sys.platform.startswith ('linux')' do pracy z Pythonem> = 3.3. –

+0

Odpowiedź Per @ jk987, poprawna nazwa modułu to 'win32api', a nie' pywin32'. Ponadto 'SetSystemTime' przyjmuje 8 argumentów; możesz dodać '*' lub możesz zrobić 'remote_time = datetime.datetime.fromtimestamp (response.tx_time) + datetime.datetime.utcnow() - datetime.datetime.now()', a następnie 'win32api.SetSystemTime (remote_time .rok, zdalny_czas.miesiąc, zdalny_czas.isoweekday(), zdalny_czas.day, zdalny_czas.czas, zdalny_czas.minut, zdalny_czas.second, zdalny_czas.microsecond // 1000) '. – wecsam

-1

dobrze teraz myślę, że jest to najlepsze rozwiązanie

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' 

na razie jest to rozwiązanie tymczasowe, z nadzieją, że to pomocne, aslo spojrzeć

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

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

+0

win32api.setSystemTime działa dla mnie ... –

+0

i polecenie daty dla Linuksa? również polana, aby usłyszeć, że – Hamoudaq

+1

To oczywiście tworzy podproces do uruchomienia polecenia 'date' systemu, jeśli system jest linux. Coś, czego OP nie chce robić. – tMC

4

musiałem zmodyfikować wersję win32 odpowiedzi trochę 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) 

Np. kiedy go używać, aby ustawić czas według starego serwera czasu (Time Protocol, RFC868) Robię to przybliżeniu ten sposób:

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

pomija 'z datetime importu datetime' w przeciwnym razie działa po zainstalowaniu pywin32 – 576i

Powiązane problemy