Wie kann ich das Systemdatum, die Uhrzeit und die Zeitzone in Python ändern? Gibt es dafür ein Modul?
- Ich möchte keine Systembefehle ausführen
- Ich möchte eine gemeinsame Lösung, die sowohl unter Unix als auch unter Windows funktionieren sollte.
Abhishek Kulkarni
Wie kann ich das Systemdatum, die Uhrzeit und die Zeitzone in Python ändern? Gibt es dafür ein Modul?
tMC
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)
Ich habe keinen Windows-Rechner, also habe ich ihn nicht unter Windows getestet … Aber Sie bekommen die Idee.
Benutzen if sys.platform.startswith('linux')
mit Python arbeiten >= 3.3.
– Craig McQueen
20. Juni ’17 um 5:53
Laut Antwort von @jk987 lautet der korrekte Modulname win32api
, nicht pywin32
. Ebenfalls, SetSystemTime
braucht 8 Argumente; du könntest das hinzufügen *
, oder du könntest tun remote_time = datetime.datetime.fromtimestamp(response.tx_time) + datetime.datetime.utcnow() - datetime.datetime.now()
und dann 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
7. August ’17 um 13:08
Gut erledigt! Aber datetime.datetime() akzeptiert Mikrosekunden, keine Millisekunden, daher sollten Sie mit 1000 und nicht mit 1000000 multiplizieren, um sie in Nanosekunden umzuwandeln.
– daghemo
28. März ’20 um 10:26
Beachten Sie, dass ab Python 3.3 der Linux-Teil dieses Codes mit Python vereinfacht werden kann time.clock_settime() -Funktion, anstatt ctypes zum Aufrufen der Systembibliothek zu verwenden.
– pavon
26. Februar ’21 um 2:08
Amir
Die Antwort des tMC scheint großartig zu sein. Allerdings hat es bei mir nicht richtig funktioniert. Ich habe herausgefunden, dass es einige Updates benötigt, sowohl für Linux als auch für Windows + Python 3. Hier ist mein aktualisiertes Modul:
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)
Für Linux lesen Sie die folgende Antwort: Stellen Sie die Hardwareuhr in Python ein?
Wie oben erwähnt, scheint datetime.datetime() Mikrosekunden und keine Millisekunden zu akzeptieren, daher sollten Sie mit 1000 und nicht mit 1000000 multiplizieren, um sie in Nanosekunden umzuwandeln.
– daghemo
28. März ’20 um 10:28
@daghemo Was meinst du? Wo multipliziere ich?
– Amir
30. März ’20 um 19:05
bitte vergiss mich: vielleicht macht mich die soziale Distanzierung für CODIV-19 hier in Italien verrückt! 🙁 Sie scheinen datetime.isoformat() zu verwenden, um das Datum zu konvertieren und an den Datumsbefehl zu übergeben, also keine Multiplikation hier (es war das obige Beispiel, das es verwendet hat). Denken Sie nur daran, dass die letzte 0 in Ihrem time_tuple bleibt für Mikrosekunden, nicht Millisekunden. Das ist alles. Kein echter Fehler. 🙂
– daghemo
1. Apr. ’20 um 8:08
Sie führen Systembefehle aus, während OP ausdrücklich darum gebeten hat, dies zu vermeiden.
– drakorg
27. November ’20 um 20:13
Ich musste die Win32-Version der Antwort von tMC ein wenig ändern:
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)
Z.B. Wenn ich es verwende, um die Zeit nach dem alten Zeitserver (Zeitprotokoll, RFC868) einzustellen, mache ich es ungefähr so:
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,))
vermisst from datetime import datetime
ansonsten funktioniert nach der Installation von pywin32
– 576i
11.11.16 um 19:20
Mohammad Shojaa
Das funktioniert bei mir
def _win_set_time(datetime_obj: datetime):
import win32api
# http://timgolden.me.uk/pywin32-docs/win32api__SetSystemTime_meth.html
# win32api.SetSystemTime(year, month , dayOfWeek , day , hour , minute , second , millisecond )
utc_datetime = datetime_obj.astimezone().astimezone(timezone.utc).replace(tzinfo=None)
day_of_week = utc_datetime.isocalendar()[2]
win32api.SetSystemTime(utc_datetime.year, utc_datetime.month, day_of_week,
utc_datetime.day, utc_datetime.hour, utc_datetime.minute, utc_datetime.second,
int(utc_datetime.microsecond / 1000))
real_time_str = "2020 12 24 13 11 10 321"
real_time = datetime.strptime(real_time_str, '%Y %m %d %H %M %S %f')
_win_set_time(real_time)
naja im moment denke ich das ist die beste lösung
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'
im Moment ist es eine vorübergehende Lösung, hoffentlich ist es hilfreich, auch schau mal rein
http://timgolden.me.uk/pywin32-docs/win32api__SetSystemTime_meth.html
http://timgolden.me.uk/pywin32-docs/win32api__SetLocalTime_meth.html
Dadurch wird natürlich ein Unterprozess erstellt, um die date
Systembefehl, wenn das System Linux ist. Etwas, das der OP nicht tun möchte.
– tMC
6. September ’12 um 5:56
Dadurch wird natürlich ein Unterprozess erstellt, um die date
Systembefehl, wenn das System Linux ist. Etwas, das der OP nicht tun möchte.
– tMC
6. September ’12 um 5:56
.
schau es dir an >> docs.python.org/library/datetime.html
– Hamoudaq
22. August ’12 um 21:13
Angesichts der Systemberechtigungen und der Authentifizierung ist dies sowohl für Unix als auch für Windows schwieriger als Sie denken.
– der Wolf
22. August ’12 um 21:18 Uhr
@EngHamoud, ich glaube nicht, dass
datetime
Modul kann die Systemzeit einstellen. Hier sind einige Möglichkeiten, dies unter Windows und Linux zu tun.– Ben Hoyt
22. August ’12 um 21:42
@benhoyt: Richtig… Datetime ist in diesem Fall nicht nützlich…. Danke für diese beiden Lösungen… aber ich brauche eine Kombinationslösung für beide Plattformen. Dies entspricht also meinen Anforderungen nicht..
– Abhishek Kulkarni
22. August ’12 um 21:46
@Blender: Danke, dass du mich wieder aufgeklärt hast 🙂 Ich wollte keine Zeit damit verschwenden, meine eigenen zu schreiben, wenn etwas gebrauchsfertig verfügbar ist.
– Abhishek Kulkarni
24. August ’12 um 11:20