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

如何在windows中使用python更改系统时区?,python,windows,timezone,Python,Windows,Timezone,如何使用python的win32api更改系统时区?我试过使用SetTimeZoneInformation win32api.SetTimeZoneInformation(year, month, dayofweek, hour, minute,

如何使用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_时区名称的特权。如何在python中设置它?使用WMI

谢谢,

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

[0]整数:偏差

[1] 字符串:StandardName

[2] SYSTEMTIME元组:StandardDate

[3] int:标准偏差

[4] 字符串:DaylightName

[5] SYSTEMTIME元组:DaylightDate

[6] 国际:日光偏倚

更重要的是,请尝试
win32api.GetTimeZoneInformation
()查看元组的外观,以便
win32api.SetTimeZoneInformation
不会抱怨

编辑:获取必要的权限

您需要
SE\u TIME\u ZONE\u NAME
权限(请参阅)。有一个方便的更改特权的实现,
AdjustPrivilege

将所有内容放在一起:

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))
基于Tim Golden的方法,该方法采用以下形式的元组:

[0]整数:偏差

[1] 字符串:StandardName

[2] SYSTEMTIME元组:StandardDate

[3] int:标准偏差

[4] 字符串:DaylightName

[5] SYSTEMTIME元组:DaylightDate

[6] 国际:日光偏倚

更重要的是,请尝试
win32api.GetTimeZoneInformation
()查看元组的外观,以便
win32api.SetTimeZoneInformation
不会抱怨

编辑:获取必要的权限

您需要
SE\u TIME\u ZONE\u NAME
权限(请参阅)。有一个方便的更改特权的实现,
AdjustPrivilege

将所有内容放在一起:

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))

很抱歉迟了答复。谢谢你@pandita,它很管用。我可以用第二个参数更改当前日期和时间吗?因为当我使用SetSystemTime更改日期/时间时,它会自动增加+8小时或取决于时区。@pandita如果我想将时区更改为
欧洲/伦敦
,我该怎么做?简单地替换东部标准时间是行不通的。有什么解释吗?或者,该参数的所有有效值是什么?@swdev我认为命名遵循标准时区约定。看见对于伦敦,我会尝试
格林威治标准时间
这里列出了Windows 8.1注册表中定义的完整/精确时区:对于伦敦,我必须使用
GMT标准时间
谢谢@pandita!很抱歉迟了答复。谢谢你@pandita,它很管用。我可以用第二个参数更改当前日期和时间吗?因为当我使用SetSystemTime更改日期/时间时,它会自动增加+8小时或取决于时区。@pandita如果我想将时区更改为
欧洲/伦敦
,我该怎么做?简单地替换东部标准时间是行不通的。有什么解释吗?或者,该参数的所有有效值是什么?@swdev我认为命名遵循标准时区约定。看见对于伦敦,我会尝试
格林威治标准时间
这里列出了Windows 8.1注册表中定义的完整/精确时区:对于伦敦,我必须使用
GMT标准时间
谢谢@pandita!