将字符串与Python datetime已铸造对象连接时出错

时间:2015-09-15 16:45:23

标签: python string datetime string-concatenation

我一直在网上搜索这个问题的解决方案而没有运气。我试图连接一个字符串与日期时间对象,以形成.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"}

更奇怪的情况是,在方法调用之后添加任何键时,似乎没问题。

3 个答案:

答案 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文本。对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"))