2016-07-15 16 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

希望它可以幫助:)