如何在Windows中使用python更改系统时区?

时间:2013-11-28 03:00:49

标签: python windows timezone

如何使用python的win32api更改系统时区?我尝试过使用SetTimeZoneInformation。

win32api.SetTimeZoneInformation(year,
                            month,
                            dayofweek,
                            hour,
                            minute,
                            second,
                            milliseconds)

这给了我一个毫秒参数的错误。

TypeError: Objects of type 'int' can not be converted to Unicode.

SetTimeZoneInformation的参数是什么?文档说它需要SE_TIME_ZONE_NAME的特权。如何在python中设置?使用WMI?

谢谢,

1 个答案:

答案 0 :(得分:1)

基于Tim Golden的win32api docs,该方法采用以下形式的元组:

[0] int:Bias

[1] string:StandardName

[2] SYSTEMTIME元组:StandardDate

[3] int:StandardBias

[4] string:DaylightName

[5] SYSTEMTIME元组:DaylightDate

[6] int:DaylightBias

更重要的是,请尝试win32api.GetTimeZoneInformationdocs)看看元组应该是什么样子,以便win32api.SetTimeZoneInformation不会抱怨。

编辑:获得必要的权限

您需要SE_TIME_ZONE_NAME权限(请参阅here)。有一个方便的实现更改权限,AdjustPrivilege over here

全部放在一起:

import ntsecuritycon, win32security, win32api

def AdjustPrivilege( priv ):
    flags = ntsecuritycon.TOKEN_ADJUST_PRIVILEGES | ntsecuritycon.TOKEN_QUERY
    htoken =  win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags)
    id = win32security.LookupPrivilegeValue(None, priv)
    newPrivileges = [(id, ntsecuritycon.SE_PRIVILEGE_ENABLED)]
    win32security.AdjustTokenPrivileges(htoken, 0, newPrivileges)

# Enable the privilege
AdjustPrivilege(win32security.SE_TIME_ZONE_NAME)

# Set the timezone
win32api.SetTimeZoneInformation((-600,u'Eastern Standard Time',(2000,4,1,3,0,0,0,0),0,u'Eastern Daylight Time',(2000,10,1,2,0,0,0,0),-60))