Python-Modul zum Ändern von Systemdatum und -uhrzeit

Lesezeit: 6 Minuten

Python Modul zum Andern von Systemdatum und uhrzeit
Abhishek Kulkarni

Wie kann ich das Systemdatum, die Uhrzeit und die Zeitzone in Python ändern? Gibt es dafür ein Modul?

  1. Ich möchte keine Systembefehle ausführen
  2. Ich möchte eine gemeinsame Lösung, die sowohl unter Unix als auch unter Windows funktionieren sollte.

  • 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

Python Modul zum Andern von Systemdatum und uhrzeit
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

Python Modul zum Andern von Systemdatum und uhrzeit
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

1641963552 812 Python Modul zum Andern von Systemdatum und uhrzeit
Mohammad Shojaa

Das funktioniert bei mir

  • Konvertieren Sie automatisch in UTC-Zeit
  • Zeichenfolge in Datum/Uhrzeit konvertieren
  • Datum/Uhrzeit-Eingabe verwenden
  • es ist lesbarer
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

.

418810cookie-checkPython-Modul zum Ändern von Systemdatum und -uhrzeit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy