Python module to change system date and time
Question: How can I change System Date, Time, Timezone in Python? Is there any module
available for this?

  1. I don't want to execute any system commands
  2. I want one common solution, which should work on both Unix and Windows.


Answer: 
    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)
    

I don't have a windows machine so I didn't test it on windows... But you get
the idea.

