Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python module to change system date and time

Tags:

python

date

time

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.
like image 333
Abhishek Kulkarni Avatar asked Aug 22 '12 20:08

Abhishek Kulkarni


2 Answers

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.

like image 196
tMC Avatar answered Sep 23 '22 16:09

tMC


The tMC's answer seems great. However, it was not working for me properly. I figured out it needed some updates, for both Linux and Windows + python 3. Here is my updated module:

import sys from _datetime 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 win32api     dayOfWeek = datetime(*time_tuple).isocalendar()[2]     t = time_tuple[:2] + (dayOfWeek,) + time_tuple[2:]     win32api.SetSystemTime(*t)   def _linux_set_time(time_tuple):     import subprocess     import shlex      time_string = datetime(*time_tuple).isoformat()      subprocess.call(shlex.split("timedatectl set-ntp false"))  # May be necessary     subprocess.call(shlex.split("sudo date -s '%s'" % time_string))     subprocess.call(shlex.split("sudo hwclock -w"))   if sys.platform == 'linux2' or sys.platform == 'linux':     _linux_set_time(time_tuple)  elif sys.platform == 'win32':     _win_set_time(time_tuple) 

For Linux read the following answer: Set the hardware clock in Python?

like image 26
Amir Avatar answered Sep 23 '22 16:09

Amir