2014-09-10 61 views
5

我很難過。我在Mac上編寫了Python 2.7.5中的日期清理函數,但在我的Ubuntu服務器上沒有2.7.6。Python的日期時間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 

爲什麼在Ubuntu的2.7.6上這不起作用?

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' 

編輯:我嘗試使用時區以小寫%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' 
+0

只是將它縮小,同一臺機器或不同機器嗎? – NPE 2014-09-10 20:01:44

+1

哦,只是注意到不同的操作系統,如此明顯不同的機器。 – NPE 2014-09-10 20:02:18

+0

不同的機器。我在我的Mac上有2.7.5,但我試圖運行腳本的服務器(Ubuntu)有2.7.6。 – 2014-09-10 20:02:48

回答

4

時區縮寫不明確。 For example,EST可以表示東部標準 在美國的時間,或者它可能意味着在澳大利亞的東部夏令時間。

因此,包含時區縮寫的日期時間字符串不能被 可靠地解析到可識別時區的日期時間對象中。

strptime'%Z'格式將只匹配UTC,GMT或時區縮寫 在time.tzname列出,這是機器語言環境相關。

如果你可以改變日期時間字符串包含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)) 
+0

謝謝。用你的方法和'str.replace('PDT','-0700')'我很好走。 – 2014-09-10 20:50:51

3

%Z將只接受GMT,UTC,不管在time.tzname上市之後,由於時區的功能是特定於平臺,如給出here

支持的%Z指令是基於包含在值tzname和日光是否屬實。因爲這個原因,除了識別UTC和GMT總是 已知(並且被認爲是非夏時制時區)以外,它是特定於平臺的 。

因此,嘗試通過運行要弄清楚什麼時區是由你的平臺支持以下內容:

import time 
time.tzname 

我得到如下:

('PST', 'PDT') 

因此,你最好的選擇可能是預先將您的時間轉換爲默認允許時區之一。