可变插值改变了Delorean函数的结果

时间:2016-03-24 03:38:36

标签: python-2.7 time epoch hubspot delorian

是的,所以我刚刚通过this HubSpot endpoint上传了大约26,000个笔记,而且我注意到一堆上传的笔记有非常错误的时间戳(例如,而不是过时的,或者是最新的,他们远远地投入了未来。)

我已将问题追溯到我的代码的一部分,该代码使用Delorean模块,以便更轻松地解析时间并将时间转换为时间戳。问题似乎是,当我通过.format()函数使用变量插值时 - 它似乎以某种方式改变了某些东西。

示例1 - 无插值。

def ref_date_epoch():
        parseDate = parse("29/04/2014 00:00:00 -0700")
        getEpoch = parseDate.epoch
        shiftEpoch = epoch(getEpoch).shift("US/Eastern")
        convertEpoch = shiftEpoch.epoch
        testing = int(convertEpoch)
        return "{testing}000".format(testing=testing)

print(ref_date_epoch())
sys.exit()

上面的示例返回1398754800000作为纪元时间戳,它将转换为正确的日期 - 29/04/2014

示例2 - 使用插值。

def ref_date_epoch(datestr):
    if len(datestr) > 0:
        parseDate = parse("{csvDate} 00:00:00 -0700".format(csvDate=datestr))
        getEpoch = parseDate.epoch
        shiftEpoch = epoch(getEpoch).shift("US/Eastern")
        convertEpoch = shiftEpoch.epoch
        testing = int(convertEpoch)
        return "{testing}000".format(testing=testing)
    else:
        None

print(ref_date_epoch(row[2]))
sys.exit()

这一次,上面的示例返回1597302000000作为纪元时间戳,这确实是错误的 - 它最终成为13/08/2020。详细说明,datestr参数接受列表row[2],该列表引用包含日期的csv中行的索引。

示例3.没有.format()功能:

def ref_date_epoch(datestr):
    if len(datestr) > 0:
        parseDate = parse(datestr)
        getEpoch = parseDate.epoch
        shiftEpoch = epoch(getEpoch).shift("US/Eastern")
        convertEpoch = shiftEpoch.epoch
        testing = int(convertEpoch)
        return "{testing}000".format(testing=testing)
    else:
        None

print(ref_date_epoch(row[2]))
sys.exit()

这仍然会返回1597276800000。似乎间接引用日期的行为似乎改变了时间。是什么给了什么?

说完了所有这些 - 如果没有办法让Delorean以这种方式工作,有没有人知道将日期字符串转换为时间戳的方法有毫秒?

编辑:我也忘了提到许多笔记也是正确的 - 我运行脚本的计算机是否会影响纪元时间戳的创建?

1 个答案:

答案 0 :(得分:0)

没关系,看起来它是格式不正确的CSV(使用dd/mm/yy而不是dd/mm/yyyy和复杂的代码的混合物。我现在正在使用它,它似乎正在工作:

def ref_date_epoch():
        parseDate = parse(row[2])
        getEpoch = parseDate.epoch
        shiftEpoch = epoch(getEpoch).shift("US/Eastern")
        convertEpoch = shiftEpoch.epoch
        testing = int(convertEpoch)
        return "{testing}000".format(testing=testing)