Python的日期时间strptime()在机器之间不一致

时间:2014-09-10 20:00:10

标签: python datetime timezone cross-platform python-dateutil

我很难过。我编写的日期清理功能在我的Mac上使用Python 2.7.5,但在我的Ubuntu服务器上不在2.7.6中。

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'

2 个答案:

答案 0 :(得分:4)

时区缩写含糊不清。 For example,EST可能意味着东部标准 在美国的时间,或者它可能意味着在澳大利亚的东部夏令时。

因此,包含时区缩写的日期时间字符串不能 可靠地解析为时区感知的日期时间对象。

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

答案 1 :(得分:3)

%Z只接受GMT,UTC以及time.tzname中列出的任何内容,因为时区功能是特定于平台的,如here所示:

  

对%Z指令的支持基于包含的值   tzname以及日光是否真实。因此,它是   除了识别始终的UTC和GMT之外,特定于平台的   已知(并且被认为是非夏令时区)。

因此,请尝试通过运行以下内容来确定您的平台支持的时区:

import time
time.tzname

我得到以下内容:

('PST', 'PDT')

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