6

YAML 仕様によると、タイムゾーン付きの iso8601 日付が認識される必要があります。ただし、PyYAML 3.10 (ActivePython 2.7.2.5 を搭載した Windows 7) を使用してそれらを解析しようとすると、単純な日付が取得されます。

In [7]: yaml.load("2001-12-14t21:59:43.10-05:00")
Out[7]: datetime.datetime(2001, 12, 15, 2, 59, 43, 100000)

In [8]: yaml.load("2001-12-14 21:59:43.10 -5")
Out[8]: datetime.datetime(2001, 12, 15, 2, 59, 43, 100000)

(最初の形式は厳密な iso8601 で、2 番目は「緩和された」形式です。例は YAML 仕様から直接取得されています。)

これは予想される動作ですか、それとも私の PyYaml が正しく機能していませんか?

4

3 に答える 3

9

デフォルトの動作 (単純な utc 日時、utc オフセットが失われる) が気に入らない場合は、独自のコンストラクターを提供できます。

import dateutil.parser
import yaml

def timestamp_constructor(loader, node):
    return dateutil.parser.parse(node.value)
yaml.add_constructor(u'tag:yaml.org,2002:timestamp', timestamp_constructor)

print(repr(yaml.load("2001-12-14T21:59:43.10-05:00")))
# -> datetime.datetime(2001, 12, 14, 21, 59, 43, 100000, tzinfo=tzoffset(None, -18000))
于 2012-11-08T18:46:15.437 に答える