如何使用PyYAML创建当前本地日期和时间

12 投票
1 回答
13152 浏览
提问于 2025-04-16 07:11

我想用 datetime.datetime.now() 来创建一个日期时间对象,使用的是 PyYAML。调用一些函数其实很简单:

>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>> 

不过,我就是搞不清楚怎么才能得到一个 datetime.now()。我试过很多不同的方式,尝试用各种 Python YAML 标签 来调用它。

但是这些都不行:

tests = [ 
        'dt: !!python/object:datetime.datetime.now []',
        'dt: !!python/object/new:datetime.datetime.now []',
        'dt: !!python/object/apply:datetime.datetime.now []',
]

for y in tests:
    try:
        print yaml.load(y)
    except Exception, err:
        print '==>', err

1 个回答

10

我觉得这个例子达到了你想要的效果:

dt = yaml.load("""dt: !!python/object/apply:apply
    - !!python/object/apply:getattr
        - !!python/name:datetime.datetime
        - now
    - []
""")

不过,我觉得这个方法有点牵强,因为PyYAML支持的!!python/object语法并不应该用来调用类的方法(datetime.datetime.now实际上就像是一个“静态”工厂方法,用来生成datetime对象)。正如你所说,这个方法更简单(虽然不是你想要的):

dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")

另一个可能的解决办法是创建一个自定义的辅助函数,来包装对datetime.datetime.now的调用,这样就可以用!!python/object/apply轻松序列化。不过缺点是,这种序列化在没有这个自定义函数的环境中就无法使用。

总之,我认为序列化一个总是返回当前时间的值并没有太大意义(实际上这个时间是解析YAML时的时间)。PyYAML提供了一个快捷方式来序列化特定的时间戳:

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")

撰写回答