将字符串与 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文本。 timestampformatted_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"))