Функция 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 5

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

Таким образом, ваш лучший выбор может заключаться в том, чтобы заранее преобразовать ваше время в один из разрешенных по умолчанию часовых поясов.