Skip to main content
 首页 » 编程设计

python之pickle 后日期时间戳是否更新

2025年05月04日2998°冷暖

我正在使用 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] 排除时区差异等。