我应该如何序列化dateutil.tz.tzlocal对象?

时间:2017-09-20 22:33:42

标签: python datetime

我想捕获一个时间戳和当前时区,并将其序列化为一个文件(在JSON或YAML中,但这不是我的问题),以便以后在另一台计算机上进行检索。

时间戳很简单,我只会使用time.time()

要获取当前时区,我看了another SO question,似乎可以使用dateutil.tz.tzlocal 获得当前时区。

现在我只需要弄清楚如何序列化它。名字很简单,这只是一个字符串,但偏移似乎很奇怪;我只期待一个数字:

import time
import datetime
import dateutil

now = datetime.datetime.utcfromtimestamp(time.time())
tzlocal = dateutil.tz.tzlocal()
print tzlocal.tzname(now)
print tzlocal.utcoffset(now)

但打印

US Mountain Standard Time
-1 day, 17:00:00

并且utcoffset的结果似乎是一个对象。我如何得到这个号码?

2 个答案:

答案 0 :(得分:1)

哦,没关系,tzlocal.utcoffset(now)会返回datetime.timedelta,我可以致电total_seconds()

import time
import datetime
import dateutil
import json

now = datetime.datetime.utcfromtimestamp(time.time())
tzlocal = dateutil.tz.tzlocal()
info_str = json.dumps(dict(name=tzlocal.tzname(now),
                       offset=tzlocal.utcoffset(now).total_seconds()))
print info_str

打印(在我的电脑上)

{"name": "US Mountain Standard Time", "offset": -25200.0}

答案 1 :(得分:1)

我不确定您的应用程序是什么,但作为默认设置,我建议使用时区偏移量序列化为ISO 8601时间戳。更好的是,首先转换为UTC ...这使得碰巧浏览序列化数据的人更容易,因为他们不必在头脑中进行日期数学计算。

可能存在坚持使用数字时间戳的性能原因,但在放弃人类可读的ISO时间戳奖励之前,我想要证明这是我的应用程序的瓶颈。