2014-09-10 5 views
5

Я в тупике. Функции очистки даты я написал в Python 2.7.5 на моем Mac, но не на 2.7.6 на моем сервере Ubuntu.Python datetime strptime() несовместим между машинами

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: я попытался использовать смещение часового пояса с строчной% г, но по-прежнему получаю сообщение об ошибке (хотя другой один):

>>> 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' 
+0

Просто сужать его вниз, та же машина или различные машины? – NPE

+1

О, просто заметили разные ОС, так что разные машины. – NPE

+0

Различные машины. У меня 2,7,5 на моем Mac, но сервер (Ubuntu), с которым я пытаюсь запустить скрипт, равен 2.7.6. –

ответ

4

Сокращения часового пояса неоднозначны. For example, EST может означать восточный стандарт Время в США, или это может означать восточное летнее время в Австралии.

Следовательно, строки datetime, содержащие сокращения часового пояса, не могут быть надежно проанализированы в объектах datetime, ориентированных на часовой пояс.

strptime формат «S '%Z' будет соответствовать только UTC, GMT или часовой пояс аббревиатуру , перечисленных в time.tzname, который является машинно-зависимыми от локали.

Если вы можете изменить строки даты-времени на те, содержащие смещения UTC, то вы могли бы использовать dateutil для разбора строк в часовых поясов, знают даты и времени объектов:

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

Спасибо. С вашим методом и 'str.replace ('PDT', '-0700')' Мне хорошо. –

3

%Z будет принимать только GMT, UTC, и все указана в time.tzname, так как функциональные возможности часового пояса зависит от платформы, так как дается here:

Поддержка директивы% Z основан на значениях, содержащихся в tzname и является ли дневной свет истинным. Из-за этого это зависит от платформы, за исключением распознавания UTC и GMT, которые всегда известны (и считаются часовыми поясами, не учитывающими летнее время).

Так попытайтесь выяснить, что часовые пояса поддерживаются платформы, выполнив следующие действия:

import time 
time.tzname 

я получаю следующее:

('PST', 'PDT') 

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