2016-07-15 11 views
1

我使用datetime.date.today()。创建时间戳。在代码的后面,这一个应该与另一个(当前)时间戳进行比较,但只是在日期级别上:“如果当前日期不是前一个时间戳的日期,则执行一些操作”。酸洗后日期时间戳是否更新?

为此,我使用pickle保存第一个时间戳。现在我想知道,如果日期时间对象将在pickle.load后自动更新,如果加载日期不是“倾销”日期。毕竟,这个函数被命名为“今天”...我希望,这不是一个愚蠢的问题,我设法正确地解释我的问题。

+0

不,时间戳不autoupdated。我觉得你比较时间是错误的。 。如果您可以使用代码片段提供详细信息,那将会更有帮助。 –

+0

尝试'type(datetime.date。今日()。天)'。你会看到它是一个'int'。所以它不知道“今天”的任何内容,它只是一个数字。 – matiasg

+0

一个与问题无关的小问题:为什么使用pickle存储第一个时间戳,如果只使用它“稍后在代码中”?您的程序是否停止执行,然后在恢复时加载上次的时间戳? – MisterMiyagi

回答

3

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

如果你看一下函数的文档(通过help(datetime.datetime.today EG),它提供了这样:

当前日期或日期时间:同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.datetimep0,将字符串'\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]时区等霸菱差异

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

希望它可以帮助:)