Заставить Python реагировать на изменения часового пояса Windows



Когда Python работает под Windows, время.localtime не сообщает правильное время, если часовой пояс изменяется в течение времени жизни экземпляра Python. Под Linux-время.tzset всегда можно запустить, чтобы облегчить подобные проблемы, но в Windows, похоже, нет эквивалента.



Есть ли способ исправить это, не делая ничего абсурдного, как, о, я не знаю...

#!/bin/env python
real_localtime = eval(subprocess.Popen(
["python","-c", "import time;repr(time.localtime())"],
stdout=subprocess.PIPE).communicate()[0])
687   3  

3 ответов:

Более рациональным решением является использование метода Kernel32 GetLocalTime с pywin32 или ctypes. Любые изменения часового пояса отражаются немедленно.

import ctypes
class SYSTEMTIME(ctypes.Structure):
    _fields_ = [
        ('wYear', ctypes.c_int16),
        ('wMonth', ctypes.c_int16),
        ('wDayOfWeek', ctypes.c_int16),
        ('wDay', ctypes.c_int16),
        ('wHour', ctypes.c_int16),
        ('wMinute', ctypes.c_int16),
        ('wSecond', ctypes.c_int16),
        ('wMilliseconds', ctypes.c_int16)]

SystemTime = SYSTEMTIME()
lpSystemTime = ctypes.pointer(SystemTime)
ctypes.windll.kernel32.GetLocalTime(lpSystemTime)
print SystemTime.wHour, SystemTime.wMinute 

Нет, это нельзя исправить, не сделав того, что вы сделали. Это немного абсурдно, но если вам нужен правильный часовой пояс в Windows, и он изменился во время выполнения программы, это необходимо сделать.

Это, вероятно, не ошибка (в документации очень ясно, что функция tzset() доступна только в Unix). Скорее всего, это слабое место в Windows, которое мешает программистам Python реализовать tzset() под ним. Вы можете сделать запрос на улучшение функции, но это было так путь с Python 2.3 (7 лет), так что маловероятно, что он действительно будет реализован.

Суть в том, что с VC ver 6 tzset() не работает должным образом. Однако с VC ver 8 tzset () теперь работает (я думаю, что он может работать и в ver 7, но у меня нет этой версии, чтобы проверить).

Поэтому все, что должно произойти сейчас, это включить HAVE_WORKING_TZSET в исходном коде и повторно скомпилировать (и протестировать).

По моему опыту, все потребности функций для различных настроек TZ должны иметь рабочий tzset(). Вы должны вызывать tzset () при каждом изменении С т. з. Яз УАК-или - TIME_ZONE_INFORMATION окна. Это было невозможно в VC ver 6, и именно поэтому HAVE_WORKING_TZSET не включен (но теперь должен быть по крайней мере для VC ver 8 и выше).

Кстати. Для всех дат и времени, которые я делаю, у меня всегда есть SetUtcTime() и UnsetUtcTime (), которые устанавливают TZ в GMT и соответственно вызывают tzset (). У меня также есть функции для установки темпа в другой часовой пояс, а также. Это единственный способ сделать это правильно! По многолетнему опыту я могу сказать, что все остальное-это беда. И календарь.timegm () не является правильный. Используйте tzset ().

Вот доказательство того, что он теперь работает (так что идите ошибка автора, чтобы исправить код windows):

(я набрал это с другого компьютера, так что, надеюсь, никаких орфографических ошибок, но это пункт, который я делаю, а не код).


Примечание: все, что ниже-это PYTHON (я вызываю C Lang из интерфейса ctype python) Примечание: потому что я устанавливаю TZ через границу DLL здесь и поток локальный и все это дерьмо, оно не может быть использовано в качестве обходной. Необходимо повторно включить HAVE_WORKING_TZSET.

import time
from ctypes import *

dTime = time.time ()
nTime = int (dTime)
intTime = c_int (nTime)

print time.ctime (dTime)
print c_char_p (cdll.msvcrt.ctime (addressof (intTime))).value

-> ... 21: 02: 40 ... (python)
- > ... 21: 02: 40 ... (C lang)

cdll.msvcrt._putenv ('TZ=GMT')
cdll.msvcrt._tzset ()

(обычно время.будет вызван tzset (), а также вызов inittimezone () для обновления переменные часового пояса python также)

print time.ctime (dTime)
print c_char_p (cdll.msvcrt.ctime (addressof (intTime))).value

-> ... 21: 02: 40 ... (python)
- > ... 11: 02: 40 ... (C lang)

(поэтому, если HAVE_WORKING_TZSET определен для (ver 8 и выше), вы получите следующее:)

-> ... 11: 02: 40 ... (python)
- > ... 11: 02: 40 ... (C lang)


Просто проверьте исходный код, чтобы понять, что я имею в виду.

Я проверил это с помощью последней серии python '2.0': 2.7.2 только что.

Comments

    Ничего не найдено.