5

私は困惑しています。私が作成した日付クリーニング関数は、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'
4

2 に答える 2

4

タイムゾーンの略語はあいまいです。たとえば、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))
于 2014-09-10T20:46:55.070 に答える
3

%Zでは、GMT、UTC、および にリストされているもののみを受け入れますtime.tzname。タイム ゾーンの機能は、次のようにプラットフォーム固有であるためです

%Z ディレクティブのサポートは、tzname に含まれる値と、昼光が true であるかどうかに基づいています。このため、常に知られている UTC と GMT を認識することを除いて、プラットフォーム固有です (そして、夏時間以外のタイムゾーンと見なされます)。

したがって、次のコマンドを実行して、プラットフォームでサポートされているタイム ゾーンを確認してください。

import time
time.tzname

私は以下を取得します:

('PST', 'PDT')

したがって、最善の策は、事前に時間をデフォルトで許可されているタイム ゾーンのいずれかに変換することです。

于 2014-09-10T20:38:44.123 に答える