在Python中将日期序列化为url安全字符串

时间:2012-03-09 21:34:40

标签: python string datetime date serialization

我想将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]))

2 个答案:

答案 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