2014-09-10 12 views
5

Jestem zakłopotany. Funkcje czyszczenia daty, które napisałem, działają w Pythonie 2.7.5 na moim Macu, ale nie w 2.7.6 na moim serwerze Ubuntu.Python's datetime strptime() niespójny między maszynami

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 

Dlaczego to nie działa w wersji 2.7.6 na 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: Próbowałem przy użyciu strefy czasowej z małymi% Z, ale nadal pojawia się błąd (choć inna):

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

Żeby sprowadzić, sama maszyna lub inny maszyny? – NPE

+1

Och, właśnie zauważyłem różne systemy operacyjne, więc wyraźnie różne maszyny. – NPE

+0

Różne maszyny. Mam 2.7.5 na moim Macu, ale serwer (Ubuntu), na którym próbuję uruchomić skrypt, ma 2.7.6. –

Odpowiedz

4

Skróty strefy czasowej są niejednoznaczne. For example, EST może oznaczać Eastern Standard Czas w Stanach Zjednoczonych lub może oznaczać Wschodni Czas Letni w Australii.

Dlatego ciągi datetime zawierające skróty stref czasowych nie mogą być niezawodnie analizowane w obiektach datetime uwzględniających timezone.

strptime „s Format '%Z' będzie tylko dopasować UTC GMT lub skrót strefy czasowej wymienione w time.tzname, który jest zależny maszynowego locale.

Jeśli można zmienić struny datetime do tych zawierających UTC przesunięcia, a następnie można użyć dateutil do analizowania ciągów do strefy czasowej świadomy obiektów 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)) 
+0

Dzięki. Z twoją metodą i 'str.replace ('PDT', '-0700')' I'm good to go. –

3

%Z będzie tylko zaakceptować GMT UTC, a co jest wymieniony w time.tzname, ponieważ funkcjonalność strefa czasowa jest platforma specyficzny, jak podano here:

Wsparcie dla dyrektywy% z oparta jest na wartościach zawartych w tzname i czy światło dzienne jest prawdziwe. Z tego powodu jest on specyficzny dla platformy, z wyjątkiem rozpoznawania UTC i GMT, które są zawsze znane (i są uważane za strefy czasowe niezwiązane ze światłem dziennym).

Więc spróbuj dowiedzieć się, jakie strefy czasowe są obsługiwane przez platformę wykonując następujące czynności:

import time 
time.tzname 

uzyskać następujące:

('PST', 'PDT') 

Zatem najlepszym może być przekształcić swój czas wcześniej w jedną z domyślnych dozwolonych stref czasowych.

Powiązane problemy