我一直在网上搜索这个问题的解决方案而没有运气。我试图连接一个字符串与日期时间对象,以形成.json格式文件,但由于某种原因,这样做时出错。 这是代码:
data = '{"gpio":"00000000","timestamp":'+str(int(time()))+',"formatted_time":"'+ **str(datetime.datetime.now().strftime("%A %b %d %X"))**+'""","time_zone":"'+str(read_tz_file())+'","firmware":"0.0"}
更奇怪的情况是,在方法调用之后添加任何键时,似乎没问题。
答案 0 :(得分:3)
如果你正在写/读json,请使用json library:
import json
print json.dumps(
dict(gpio='00000000',
timestamp=time(),
formatted_time=datetime.datetime.now().strftime("%A %b %d %X"),
time_zone=read_tz_file(),
firmware='0.0'))
答案 1 :(得分:1)
对于初学者来说,将代码放在可读的形式中可能会有所帮助, 优选多行(例如每行一个json元素)。
这样可以轻松发现引用错误。
data = ('{' +
'"gpio":"00000000",'+
'"timestamp":'+str(int(time()))+','+
'"formatted_time":"'+ str(datetime.datetime.now().strftime("%A %b %d %X")) +','+
'""",'+
'"time_zone":"'+str(read_tz_file())+'",'+
'"firmware":"0.0"'+
'}')
然后尝试逐个调试错误。
e.g。 str(int(time()))
向我发出誓言:
Traceback(最近一次调用最后一次):文件“”,第1行,in TypeError:'module'对象不可调用
那是因为time
是一个模块而不是一个函数,正确的函数是time.time()
:
data = ('' +
'{"gpio":"00000000",'+
'"timestamp":'+str(int(time.time()))+','+
'"formatted_time":"'+ str(datetime.datetime.now().strftime("%A %b %d %X")) +','+
'""",'+
'"time_zone":"'+str(read_tz_file())+'",'+
'"firmware":"0.0"'+
'}')
这给了我一个有效的字符串(在提供read_tz_file()
的虚拟实现之后,但它是无效的JSON("""
应该做什么?)
更好的方法是首先构造一个字典,并转换为json:
import json
d={
"gpio": 0,
"timestamp": int(time.time()),
"formatted_time": (datetime.datetime.now().strftime("%A %b %d %X"),
"time-zone": read_tz_file(),
"firmware": "0.0"
}
s=json.dumps()
print(s)
答案 2 :(得分:1)
使用json模块生成json文本。对timestamp
和formatted_time
使用相同的Unix时间:
import json
import time
ts = int(time.time())
json_text = json.dumps(dict(
gpio="00000000",
timestamp=ts,
formatted_time=time.strftime("%A %b %d %X", time.localtime(ts)),
time_zone=read_tz_file(),
firmware="0.0"))
注意:一般来说,time.localtime(ts)
可能会提供比datetime.now()
更多的信息,例如:在Python 2中:
>>> import time
>>> from datetime import datetime
>>> ts = time.time()
>>> time.strftime('%Z%z')
'CEST+0200'
>>> time.strftime('%Z%z', time.localtime(ts))
'CEST+0000'
>>> datetime.now().strftime('%Z%z')
''
>>> datetime.fromtimestamp(ts).strftime('%Z%z')
''
注意:只有time.strftime('%Z%z')
在我的计算机上提供本地时区的完整信息,请参阅python time.strftime %z is always zero instead of timezone offset。
在Python 3上,datetime.now()
也没有提供有关本地时区的信息:
>>> import time
>>> from datetime import datetime
>>> ts = time.time()
>>> time.strftime('%Z%z')
'CEST+0200'
>>> time.strftime('%Z%z', time.localtime(ts))
'CEST+0200'
>>> datetime.now().strftime('%Z%z')
''
>>> datetime.fromtimestamp(ts).strftime('%Z%z')
''
你可以解决它:
>>> from datetime import timezone
>>> datetime.now(timezone.utc).astimezone().strftime('%Z%z')
'CEST+0200'
>>> datetime.fromtimestamp(ts, timezone.utc).astimezone().strftime('%Z%z')
'CEST+0200'
如果您想在Python 3中使用datetime
;你的代码看起来像:
#!/usr/bin/env python3
import json
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
local_time = datetime.now(timezone.utc).astimezone()
json_text = json.dumps(dict(
gpio="00000000",
timestamp=(local_time - epoch) // timedelta(seconds=1),
formatted_time=local_time.strftime("%A %b %d %X"),
time_zone=read_tz_file(),
firmware="0.0"))