Chr*_*row 2 python string serialization datetime date
我想将python中的Date序列化为URL安全字符串.
我记得在C++中,我常常只取整数表示自1970年1月1日以来的秒数(或类似的东西).然后我可以把它变成一个Base64 url-safe字符串.C++日期旨在能够轻松地传递这些整数.
理想情况下,在Python中,我想获得一个表示日期的字节数组,然后将其传递给base64.urlsafe_b64encode().然后当我想反序列化时,我可以对字节进行解码并将其传递回datetime对象.我不知道如何在Python中这样做.
我相信我可以使用datetime.isoformat(),但由此产生的字符串似乎不必要地长,我不需要它是人类可读的.我也可以编写自定义函数来进行翻译,但如果可能的话我想使用官方库代码.
我错过了什么吗?有没有一种"简单"的方法可以做到这一点,我没有看到?
谢谢!
编辑:
好吧,这就是我所确定的.它是@bgporter在下面建议的变体.我的目标是将日期时间信息转换为url-safe字符串,而不占用太多不必要的空间,因此我修改了代码,使得"int"时间戳中的字节直接是base64 url编码而不是转换为字符串数字(不需要是base64 url编码).生成的时间戳大约为8个字符,如下所示a7NaTw==
:
编码时间戳(url-safe Base64字符串):
url_safe_timestamp = base64.urlsafe_b64encode(struct.pack('L', int(time.time())))
Run Code Online (Sandbox Code Playgroud)
解码时间戳(Date对象):
decoded_timestamp = datetime.datetime.fromtimestamp(float(struct.unpack('L', base64.urlsafe_b64decode(url_safe_timestamp))[0]))
Run Code Online (Sandbox Code Playgroud)
你的意思是这样的:
>>> import base64
>>> import time
>>> encoded = base64.urlsafe_b64encode("%d" % int(time.time()))
>>> print encoded
'MTMzMTMyOTE5NA=='
>>> decoded = int(base64.urlsafe_b64decode(encoded))
>>> print decoded
1331329194
>>> import datetime
>>> datetime.datetime.fromtimestamp(decoded)
datetime.datetime(2012, 3, 9, 16, 39, 54)
Run Code Online (Sandbox Code Playgroud)
?
(我不确定为什么这里的64位编码比使用十六进制值更好 - 我缺少什么?)
归档时间: |
|
查看次数: |
4971 次 |
最近记录: |