我想将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())))
解码时间戳(日期对象):
decoded_timestamp = datetime.datetime.fromtimestamp(float(struct.unpack('L', base64.urlsafe_b64decode(url_safe_timestamp))[0]))
答案 0 :(得分:8)
你的意思是这样的:
>>> 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)
(我不确定为什么这里的64位编码比使用十六进制值更好 - 我缺少什么?)
答案 1 :(得分:0)
from base64 import urlsafe_b64encode
print(
urlsafe_b64encode(
bytes.fromhex(
hex(int(time() * 1000)).lstrip('0x').rjust(12, '0')
)
).decode('ascii').rstrip('=')
)
# prints: AWkLDNvo