Python установить время системы

Python module to change system date and time

Given system permissions and authentication, this is harder to do than you think for both Unix and Windows.

@EngHamoud, I don’t think the datetime module can set the system time. Here are some ways to do it in Windows and Linux.

@benhoyt : Correct. datetime is not useful in this case. Thanks for these two solutions.. but I need one combine solution for both the platforms. So this is an inadequate to my requirement..

@Blender: Thanks for educating me again 🙂 I didn’t want to waste time in writing my own if anything available ready to use..

6 Answers 6

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.

Per @jk987’s answer, the correct module name is win32api , not pywin32 . Also, SetSystemTime takes 8 arguments; you could add the * , or you could do remote_time = datetime.datetime.fromtimestamp(response.tx_time) + datetime.datetime.utcnow() — datetime.datetime.now() and then 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) .

Читайте также:  Styling forms in php

Well done! But datetime.datetime() accepts microseconds, not milliseconds, so you should multiply by 1000 not 1000000 in order to convert them to nanoseconds.

Note that as of python 3.3, the linux part of this code can be simplified using the python time.clock_settime() function, instead of using ctypes to call into the system library.

Источник

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Как изменить системное время?

#1 Май 22, 2020 05:12:41

Как изменить системное время?

Привет!
Получил время с NTP — сервера. Как его сделать системным?
На это:
os.system(‘date ‘ + time.strftime(’%m%d%H%M%Y.%S’, time.localtime(response.tx_time)))
или это:
os.system(‘date -s “2 OCT 2010 18:00:00”’)
Ответ:
date: невозможно установить дату: Операция не позволена
Спасибо за ответы.

#2 Май 22, 2020 11:07:46

Как изменить системное время?

Ваша операционная система требует наличия определенных прав на выполнение операции. Как вы хотите питоном это исправить? Запускайте скрипт с sudo.

#3 Май 22, 2020 11:27:48

Как изменить системное время?

Это как бы понятно. Для меня вопрос больше в модуле и синтаксисе. Чем и как вызвать SUDO, и передать пароль SUDO, и чтоб все было автоматом.
Спасибо.

#4 Май 22, 2020 13:26:07

Как изменить системное время?

У вас есть питонья программа которую вы пишите. У программы не хватает прав на совершение неких операций. Вы спрашиваете, как запустить программу с повышением прав?
Ну как-то так видимо

domain@user/home$ sudo python my_program.py

Отредактировано FishHook (Май 22, 2020 13:26:32)

#5 Май 26, 2020 21:42:04

Как изменить системное время?

FishHook
Вот код, собрал из того что нашел в нэте. Делал под свои цели. Проверяет готовность сервера, если нет, спрашивает другой сервер. Если пропинговался, отправляем запрос — получить время. Потом через СУДО меняем время в системе.
Правьте под себя, товатрисчи, и будет вам счастье.

from time import strftime, localtime from ntplib import NTPClient from os import system from datetime import datetime ################################################################################### # кусок кода выполняет синхронизацию по времени с NTP- сервером # в случае не ответа одного пытается подключится к другому sudo_password = 'mypass' # sudo пароль hostnames = ["1.ua.pool.ntp.org", "0.ua.pool.ntp.org", # адреса серверов "3.ua.pool.ntp.org", "2.ua.pool.ntp.org"] minute_ntp = range(14, 60, 15) # список минут обновления времени min_now = range(0, 60) # список текущих минут для теста, в функ-ции заменить на текущую минуту cecond_main = 0.5 # секунды окончательного расчета cecond_first_update_data = [22, 44] # секунды для предварительного обновления cecond_ntp_end = 14 # после * секунды прекратить пинговать сервер NTP # В системе выставляем время по Гринвичу client = NTPClient() # создать класс клиента # не доконца понятно как работает опция -w , https://www.opennet.ru/man.shtml?topic=ping&category=8&russian=0 def time_ntp_sys(): # Проверка работоспособности сервера, если нет, попытка найти другой сервер # завершается если превысит cecond_ntp_end секунд response = None while True: now_time = datetime.now() # Текущая дата со временем cur_minute = now_time.minute # Минута текущая cur_second = now_time.second # Секунда текущие if response == 0 or cur_minute in minute_ntp and cur_second > cecond_ntp_end: break # условия выхода из ф-ии for hostname in hostnames: response = system("ping -c 1 -w 4 " + hostname) # пингуем if response == 0: # and then check the response. now_ntp = client.request(hostname, version=3) # полученные данные (класс) now_ntp_glob = now_ntp.tx_time # получ. время в глоб-ом форм.(секунд.микросек от эпохи) mlsec_txt = repr(now_ntp_glob).split('.')[1][:3] # получаю мили-да в тексте (избежать импорта datatime) now_ntp = strftime("%Y-%m-%d %H:%M:%S.<>".format(mlsec_txt), localtime(now_ntp_glob)) # формат-ие для передачи # now_ntp = "2020-05-23 10:08:51.399229" # тест пример comand = 'date -s ' # команда изменения системной даты # преобразование в строку вида: sudo date -s "2020-05-23 10:08:51.399229" comand = '%s "%s"' % (comand, now_ntp) system('echo %s|sudo -S %s' % (sudo_password, comand)) # Выполнение команды изменения даты системы break else: print('-------------------------------------------------') print(hostname, 'is down!') print("Не удача", response) print('-------------------------------------------------') time_ntp_sys() 

Источник

Читайте также:  Object class in java is abstract

nihal111 / ntp_update_time.py

A python script to update system time in Windows by attempting to fetch time from multiple NTP servers from a defined list.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import socket
import struct
import sys
import time
import datetime
import win32api
# List of servers in order of attempt of fetching
server_list = [ ‘ntp.iitb.ac.in’ , ‘time.nist.gov’ , ‘time.windows.com’ , ‘pool.ntp.org’ ]
»’
Returns the epoch time fetched from the NTP server passed as argument.
Returns none if the request is timed out (5 seconds).
»’
def gettime_ntp ( addr = ‘time.nist.gov’ ):
# http://code.activestate.com/recipes/117211-simple-very-sntp-client/
TIME1970 = 2208988800 # Thanks to F.Lundh
client = socket . socket ( socket . AF_INET , socket . SOCK_DGRAM )
data = ‘ \x1b ‘ + 47 * ‘\0’
try :
# Timing out the connection after 5 seconds, if no response received
client . settimeout ( 5.0 )
client . sendto ( data , ( addr , 123 ))
data , address = client . recvfrom ( 1024 )
if data :
epoch_time = struct . unpack ( ‘!12I’ , data )[ 10 ]
epoch_time -= TIME1970
return epoch_time
except socket . timeout :
return None
if __name__ == «__main__» :
# Iterates over every server in the list until it finds time from any one.
for server in server_list :
epoch_time = gettime_ntp ( server )
if epoch_time is not None :
# SetSystemTime takes time as argument in UTC time. UTC time is obtained using utcfromtimestamp()
utcTime = datetime . datetime . utcfromtimestamp ( epoch_time )
win32api . SetSystemTime ( utcTime . year , utcTime . month , utcTime . weekday (), utcTime . day , utcTime . hour , utcTime . minute , utcTime . second , 0 )
# Local time is obtained using fromtimestamp()
localTime = datetime . datetime . fromtimestamp ( epoch_time )
print ( «Time updated to: » + localTime . strftime ( «%Y-%m-%d %H:%M» ) + » from » + server )
break
else :
print ( «Could not find time from » + server )
Читайте также:  Php check if extension is enabled

Источник

Оцените статью