酸洗后日期时间戳是否更新?

Are datetime timestamps updated after pickling?

我正在使用 datetime.date.today().day 创建时间戳。在代码的后面,这个应该与另一个(当前)时间戳进行比较,但只是在天级别:"If the current day is not the day of the former timestamp, do stuff".

为此,我使用 pickle 保存了第一个时间戳。现在我想知道,如果加载日期不是 "dumping" 日期,日期时间对象是否会在 pickle.load 之后自动更新。毕竟,该函数被命名为 "today"...我希望这不是一个愚蠢的问题,我设法正确解释了我的问题。

方法 datetime.datetime.today() 创建 当前时刻的新 datetime.datetime 对象。对象本身不知道它是如何创建的,即函数和函数的意图都不知道。它只知道它是什么时候创建的,这就是将要存储的内容。

如果您查看该函数的文档(例如通过 help(datetime.datetime.today),它提供了以下内容:

Current date or datetime: same as self.__class__.fromtimestamp(time.time())

现在,time.time() 提供当前时间戳,例如1468585949.653488。这是一个普通数字(floatint),一旦创建,它就是常量。然后将该数字简单地馈送到 datetime.datetime.fromtimestamp。对于任何给定的时间戳,这将始终为您提供相同的 datetime [1].

In [12]: datetime.datetime.fromtimestamp(1468585949.653488)
Out[12]: datetime.datetime(2016, 7, 15, 14, 32, 29, 653487)

如果你转储这个对象,你会得到一个普通的 datetime.datetime 对象。它只是普通的 class datetime.datetime 及其数据,没有函数或方法参考,例如 datetime.datetime.today.

In [3]: print(pickle.dumps(datetime.datetime.fromtimestamp(1468585949.653488),protocol=0))
# cdatetime  # class datetime.\
# datetime   #                datetime
# p0         # push last object (datetime.datetime) to stack as p0
# (S'\x07\xe0\x07\x0f\x0e \x1d\t\xf8\xb0'  # group '(' start, string 'S' from binary ('\x07...')
# p1         # push last object (string) to stack as p1
# tp2        # create tuple from last stack group, push to stack as p2
# Rp3        # call p0(*p2)
# .          # done

那么,这个垃圾有什么用呢?它将对象 datetime.datetime 查找为 p0,将字符串 '\x07\xe0\x07\x0f\x0e \x1d\t\xf8\xb0' 存储为 p1,创建元组 p2 = tuple((p1,)),然后调用 p0(*p2).

或者换句话说,返回 datetime.datetime('\x07\xe0\x07\x0f\x0e \x1d\t\xf8\xb0')。请注意 datetime.datetime 的参数是一个 constant 字符串。这将始终为您提供原始日期时间:

In [30]: datetime.datetime('\x07\xe0\x07\x0f\x0e \x1d\t\xf8\xb0')
Out[30]: datetime.datetime(2016, 7, 15, 14, 32, 29, 653488)

[1] 除了时区等方面的差异

加载后不会自动更新。为了演示它,请查看这个小示例:

import pickle
import datetime

today1 = datetime.datetime.today()
pickle.dump(today1, open('today','wb') )   

sleep(5) 
today2 = pickle.load(open('today','r')) 

# today1 => datetime.datetime(2016, 7, 15, 18, 6, 6, 578041)
# today2 => datetime.datetime(2016, 7, 15, 18, 6, 6, 578041)

您可以看到,即使延迟 5 秒后,datetime 对象的属性(年、月、日、小时、秒 .. 等)也没有变化:today1today2

希望对您有所帮助:)