2014-09-10 83 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') 

因此,你最好的选择可能是预先将您的时间转换为默认允许时区之一。