Функция Python datetime strptime () несовместима между машинами
Я в тупике. Функции очистки даты, которые я написал, работают в Python 2.7.5 на моем Mac, но не в 2.7.6 на моем сервере Ubuntu.
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
>>> print(date)
2013-08-15 10:23:05
Почему это не работает в 2.7.6 на Ubuntu?
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2013-08-15 10:23:05 PDT' does not match format '%Y-%m-%d %H:%M:%S %Z'
Edit: я попытался использовать смещение часового пояса со строчной %z, но все равно получил ошибку (хотя и другую):
>>> date = datetime.strptime('2013-08-15 10:23:05 -0700', '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
2 ответа:
Сокращения часовых поясов неоднозначны. например , EST может означать Восточный стандарт Время в США, или это может означать Восточное летнее время в Австралии.
Поэтому строки datetime, содержащие сокращения часовых поясов, не могут быть надежно разбирается на объекты datetime с учетом часовых поясов.
strptime'формат s'%Z'будет соответствовать только UTC, GMT или аббревиатуре часового пояса перечислены вtime.tzname, который зависит от локали машины.Если вы можете изменить строки datetime на содержащих смещения по UTC, то вы можете использовать dateutil для разбора строк в объекты datetime с поддержкой часовых поясов:
import dateutil import dateutil.parser as DP date = DP.parse('2013-08-15 10:23:05 -0700') print(repr(date)) # datetime.datetime(2013, 8, 15, 10, 23, 5, tzinfo=tzoffset(None, -25200))
%Zбудет принимать только GMT, UTC и все, что указано вtime.tzname, поскольку функциональность часового пояса зависит от платформы, как указано здесь :Поддержка директивы %Z основана на значениях, содержащихся в tzname и является ли дневной свет истинным. Из-за этого она и есть специфичные для платформы, за исключением распознавания UTC и GMT, которые всегда известны (и считаются не переходящими на летнее время часовыми поясами).
Итак, попробуйте выяснить, какие часовые пояса поддерживаются вашей платформой путем выполнения следующих действий:
import time time.tznameЯ получаю следующее:
('PST', 'PDT')Таким образом, ваш лучший выбор может заключаться в том, чтобы заранее преобразовать ваше время в один из разрешенных по умолчанию часовых поясов.