根据Python module to change system date and time - 我们可以使用此代码更改系统时间。我已经调整了此代码并相应地更改了它,但执行脚本会将时间更改为UTC格式,但大约10秒后更新到正确的时间。这种无法解释的行为促使我改为使用SetLocalTime
方法。但是,我无法让它发挥作用。
import socket
import struct
import sys
import time
import win32api
TIME1970 = 2208988800
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = '\x1b' + 47 * '\0'
client.sendto(data.encode(), ('10.0.0.1', 123))
data, address = client.recvfrom(1024)
if data:
print('Response received from:', address)
t = struct.unpack('!12I', data)[10]
t -= TIME1970
tf = time.strptime(time.ctime(t))
time_tuple = (tf[0], # Year
tf[1], # Month
tf[6], # Day of Week
tf[2], # Day
tf[3], # Hour
tf[4], # Minute
tf[5], # Second
0,#int(round(tf[5] * 1000)), # Millisecond
)
print(tf)
win32api.SetLocalTime(*time_tuple)
我收到错误TypeError: SetLocalTime() takes exactly 1 argument (8 given)
。我知道SetLocalTime函数采用与SetSystemTime
完全相同的参数,但事实并非如此。
我在谷歌的任何地方找不到任何示例,所以我无法完成我的代码。
非常感谢任何建议。谢谢。
答案 0 :(得分:1)
win32api模块包装SetSystemTime
以将SYSTEMTIME
结构字段作为8个单独的函数参数。时间应该以UTC的形式传递。忽略wDayOfWeek
(即将其传递为0)。
win32api模块更方便和惯用地包装SetLocalTime
。它需要一个datetime.datetime
实例,而不需要单独的参数。例如:
import datetime
import win32api
dt = datetime.datetime(2018, 1, 4, 14, 30)
win32api.SetLocalTime(dt)
调用进程的令牌必须具有SeSystemtimePrivilege,因此通常用户需要成为提升的管理员。