酸洗后日期时间戳是否更新?
Are datetime timestamps updated after pickling?
我正在使用 datetime.date.today().day 创建时间戳。在代码的后面,这个应该与另一个(当前)时间戳进行比较,但只是在天级别:"If the current day is not the day of the former timestamp, do stuff".
为此,我使用 pickle 保存了第一个时间戳。现在我想知道,如果加载日期不是 "dumping" 日期,日期时间对象是否会在 pickle.load 之后自动更新。毕竟,该函数被命名为 "today"...我希望这不是一个愚蠢的问题,我设法正确解释了我的问题。
方法 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
对象。它只是普通的 class 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
的参数是一个 constant 字符串。这将始终为您提供原始日期时间:
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] 除了时区等方面的差异
加载后不会自动更新。为了演示它,请查看这个小示例:
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 秒后,datetime 对象的属性(年、月、日、小时、秒 .. 等)也没有变化:today1
和 today2
希望对您有所帮助:)
我正在使用 datetime.date.today().day 创建时间戳。在代码的后面,这个应该与另一个(当前)时间戳进行比较,但只是在天级别:"If the current day is not the day of the former timestamp, do stuff".
为此,我使用 pickle 保存了第一个时间戳。现在我想知道,如果加载日期不是 "dumping" 日期,日期时间对象是否会在 pickle.load 之后自动更新。毕竟,该函数被命名为 "today"...我希望这不是一个愚蠢的问题,我设法正确解释了我的问题。
方法 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
对象。它只是普通的 class 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
的参数是一个 constant 字符串。这将始终为您提供原始日期时间:
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] 除了时区等方面的差异
加载后不会自动更新。为了演示它,请查看这个小示例:
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 秒后,datetime 对象的属性(年、月、日、小时、秒 .. 等)也没有变化:today1
和 today2
希望对您有所帮助:)