将字符串与 Python 日期时间转换对象连接时出错
Error concatenating string with Python datetime casted object
我一直在网上寻找这个问题的解决方案,但没有成功。我正在尝试将字符串与日期时间对象连接起来以形成 .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"}
更奇怪的情况是,在方法调用之后添加任何键似乎都可以。
如果您是 writing/reading 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'))
对于初学者来说,将代码置于可读形式可能会有所帮助,
最好是多行(例如每行一个 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"'+
'}')
然后逐一调试错误
例如str(int(time()))
对我说:
Traceback (most recent call last): File "", line 1, in
TypeError: 'module' object is not callable
那是因为 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)
使用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"))
我一直在网上寻找这个问题的解决方案,但没有成功。我正在尝试将字符串与日期时间对象连接起来以形成 .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"}
更奇怪的情况是,在方法调用之后添加任何键似乎都可以。
如果您是 writing/reading 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'))
对于初学者来说,将代码置于可读形式可能会有所帮助, 最好是多行(例如每行一个 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"'+
'}')
然后逐一调试错误
例如str(int(time()))
对我说:
Traceback (most recent call last): File "", line 1, in TypeError: 'module' object is not callable
那是因为 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)
使用json模块,生成json文本。 timestamp
和 formatted_time
:
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"))