Модуль Python для изменения системной даты и времени

18

Как я могу изменить системную дату, время, часовой пояс в Python? Есть ли для этого модуль?

  1. Я не хочу выполнять какие-либо системные команды
  2. Я хочу одно общее решение, которое должно работать как с Unix, так и с Windows.
задан Abhishek Kulkarni 22.08.2012 в 22:58
источник
  • проверить это >> docs.python.org/library/datetime.html –  Hamoudaq 22.08.2012 в 23:13
  • Учитывая системные разрешения и аутентификацию, это сложнее, чем вы думаете как для Unix, так и для Windows. –  the wolf 22.08.2012 в 23:18
  • @EngHamoud, я не думаю, что модуль datetime может установить системное время. Вот несколько способов сделать это в Windows и Linux. –  Ben Hoyt 22.08.2012 в 23:42
  • @benhoyt: Правильно ... datetime не пригодится в этом случае .... Спасибо за эти два решения .. но мне нужно одно решение для обеих платформ. Так что это не соответствует моему требованию. –  Abhishek Kulkarni 22.08.2012 в 23:46
  • @Blender: Спасибо, что снова обучил меня :-) Я не хотел тратить время на то, чтобы написать собственное, если что-нибудь готовое к использованию. –  Abhishek Kulkarni 24.08.2012 в 13:20
Показать остальные комментарии

3 ответа

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)

У меня нет оконной машины, поэтому я не тестировал ее на окнах ... Но вы поняли идею.

    
ответ дан tMC 06.09.2012 в 06:12
источник
  • обратите внимание, что вам нужно установить pywin32 для этого. –  576i 11.11.2016 в 20:11
  • Использовать, если sys.platform.startswith ('linux') для работы с Python> = 3.3. –  Craig McQueen 20.06.2017 в 07:53
  • Ответ на @ 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 07.08.2017 в 15:08
4

Мне пришлось немного изменить версию win32 версии 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)

Eg. когда я использую его для установки времени по старому серверу времени (протокол времени, RFC868), я делаю это примерно так:

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,))
    
ответ дан jk987 27.10.2015 в 08:45
источник
  • пропуски из datetime import datetime в противном случае работают после установки pywin32 –  576i 11.11.2016 в 20:20
-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'

пока это временное решение, надеюсь, это полезно, а также посмотрите

Ссылка

Ссылка

    
ответ дан Hamoudaq 23.08.2012 в 00:30
источник
  • win32api.setSystemTime работает для меня ... –  Abhishek Kulkarni 27.08.2012 в 12:01
  • и команда даты для Linux? также прославить, чтобы услышать, что –  Hamoudaq 29.08.2012 в 01:17
  • Это, конечно, создает подпроцесс для запуска команды системы даты, если система является linux. Что-то OP не хочет делать. –  tMC 06.09.2012 в 07:56