我正在使用 datetime.date.today().day 创建时间戳。在代码的后面,这个应该与另一个(当前)时间戳进行比较,但只是在日期级别:“如果当前日期不是前一个时间戳的日期,则执行操作”。
为此,我使用 pickle 保存了第一个时间戳。现在我想知道,如果加载日期不是“倾销”日期,日期时间对象是否会在 pickle.load 之后自动更新。毕竟,该函数被命名为“今天”...我希望这不是一个愚蠢的问题,我设法正确解释了我的问题。
最佳答案
方法 datetime.datetime.today()
创建 当前时刻的新 datetime.datetime
对象。对象本身不知道它是如何创建的,即函数和函数的意图都不知道。它只知道它是什么时候创建的,这就是将要存储的内容。
如果您查看该函数的文档(例如通过 help(datetime.datetime.today
),它会提供以下信息:
Current date or datetime: same as
self.__class__.fromtimestamp(time.time())
现在,time.time()
提供当前时间戳,例如1468585949.653488
。这是一个普通数字(float
或 int
),一旦创建 就是常量。然后将该数字简单地馈送到 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
对象。它只是普通类 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
的参数是一个常量 字符串。这将始终为您提供原始日期时间:
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] 排除时区差异等。
关于python - pickle 后日期时间戳是否更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38395920/