2012-08-22 249 views
17

如何更改Python中的系統日期,時間,時區?有沒有可用的模塊?Python模塊更改系統日期和時間

  1. 我不想執行任何系統命令
  2. 我想一個通用的解決方案,這應該在Unix和Windows工作。
+0

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

+0

考慮到系統權限和身份驗證,對於Unix和Windows而言,這比您想象的要難得多。 –

+0

@EngHamoud,我不認爲'datetime'模塊可以設置系統時間。這裏有一些方法可以在[Windows](http://stackoverflow.com/questions/3281254/setting-the-system-date-in-python-on-windows)和[Linux](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) 

我沒有Windows機器,所以我沒有在Windows上測試它......但你明白了。

+0

請注意,您需要安裝pywin32才能正常工作.... – 576i

+1

使用'if sys.platform.startswith('linux')'來處理Python> = 3.3。 –

+0

根據@ jk987的回答,正確的模塊名稱是'win32api',而不是'pywin32'。另外,'SetSystemTime'有8個參數;你可以添加'*',或者你可以做'remote_time = datetime.datetime.fromtimestamp(response.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' 

現在它是治標不治本,希望這是有幫助的,ASLO看看

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

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

+0

win32api.setSystemTime適合我... –

+0

和date命令適用於Linux?也聽到這個聲音 – Hamoudaq

+1

這當然會創建一個子進程來在系統是linux的情況下運行'date'系統命令。 OP不想做的事情。 – tMC

4

我不得不修改TMC的回答點點的Win32版本:

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。當我根據多年的時間服務器(時間協議,RFC868)用它來設置時間,我aproximately做這種方式:

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

錯過'從datetime導入日期時間',否則安裝pywin32後工作 – 576i

相關問題