2013-11-28 3 views
1

Как изменить системный часовой пояс с помощью win32api python? Я попытался использовать SetTimeZoneInformation.Как изменить системный часовой пояс с помощью python в Windows?

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

На основании Тим Голден win32api docs, метод принимает кортеж следующего вида:

[0] INT: Bias

[1] строку: StandardName

[2] SYSTEMTIME tuple: StandardDate

[3] int: StandardBias

[4] строка: DaylightName

[5] SYSTEMTIME кортеж: DaylightDate

[6] INT: DaylightBias

Больше к точке, попробуйте win32api.GetTimeZoneInformation (docs), чтобы увидеть, что кортеж должен чтобы выглядеть так, чтобы win32api.SetTimeZoneInformation не стал жаловаться.

Edit: Получение необходимых привилегий

Вам нужна SE_TIME_ZONE_NAME привилегию (см here). Существует удобная реализация изменяющихся привилегий, AdjustPrivilegeover 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)) 
+0

@unice Позвольте мне знать, если он работал для вас – pandita

+0

Извините за поздний ответ. Спасибо @pandita, он работает. Могу ли я изменить текущую дату и время на второй параметр? Потому что, когда я изменяю дату/время с помощью SetSystemTime, он автоматически добавит +8 часов или в зависимости от часового пояса. – unice

+0

@pandita Если я хочу изменить часовой пояс на «Европу/Лондон», как я могу это сделать? Просто замена «Eastern Standard Time» не будет работать. Любое объяснение? Или, каковы все допустимые значения для этого аргумента? – swdev

Смежные вопросы