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

时间:2016-07-15 12:16:32

标签: python pickle

我正在使用datetime.date.today()。day创建时间戳。稍后在代码中,这个应该与另一个(当前)时间戳进行比较,但只是在日级别:“如果当前的日期不是前一个时间戳的那一天,那就去做吧。”

为此,我正在使用pickle保存第一个时间戳。现在我想知道,如果datele-object将在pickle.load之后自动更新,如果加载日期不是“转储”日期。毕竟,该功能被命名为“今天”...我希望,这不是一个愚蠢的问题,我设法正确地解释了我的问题。

2 个答案:

答案 0 :(得分:3)

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

如果您查看该功能的文档(例如通过help(datetime.datetime.today),它会提供以下信息:

  

当前日期或日期时间:与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对象。它只是普通类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)。< / p>

或者换句话说,返回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]在时区等方面的差异

答案 1 :(得分:2)

加载后它不会自动更新。要演示它,请查看以下小例子:

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秒的延迟之后,日期时间对象的属性(年,月,日,小时,秒......等)也没有变化:today1today2

希望有所帮助:)