我编写了一个模块,可以在特定时间内生成事件发生的百分比。我的数据库有一个生成事件的时间戳。我正在将y-m-d h-m-s格式的timetamp转换为纪元时间。我得到的纪元时间是UTC(GMT)时间,因为我的时区是GMT + 1。
示例如下:
我的第一个数据库条目是10:13:36,它的纪元时间是1397211216,当我尝试从我的代码中获取此条目的纪元时间时,返回的纪元时间是1397207617(09:13: 36)。我的代码如下,我知道我的纪元时间是如何定义的,但我无法弄清楚如何改变它以获得正确的时间。
def getPercentageDuringTime(dbName, sensorType, beginningTime, endTime):
count = 0
reading = [i [1]for i in cur.execute("SELECT * FROM " + dbName + " WHERE sensor = '" + sensorType + "' ")]
readingtime = [i [2] for i in cur.execute("SELECT * FROM " + dbName + " WHERE sensor = '" + sensorType + "' ")]
for i in range(len(reading)):
pattern = '%Y-%m-%d %H:%M:%S'
epoch = int(time.mktime(time.strptime(readingtime[i], pattern)))
if ((epoch >= beginningTime) and (epoch <= endTime)):
count = count + 1
percentage = count / (len(reading)) * 100
print (epoch)
return percentage
print (getPercentageDuringTime('event4312593', 'sound', 1397207617, 1397207616))
答案 0 :(得分:1)
time.mktime()
function与time.localtime()
相反,因此您的解析时间被解释为UTC,然后移至您当地的时区。
您需要在此使用的是time.gmtime()
的反转,而是隐藏在另一个模块中:calendar.timegm()
function:
>>> import time, calendar
>>> sample = '2014-04-11 10:13:36'
>>> int(time.mktime(time.strptime(sample, pattern)))
1397207616
>>> int(calendar.timegm(time.strptime(sample, pattern)))
1397211216
请考虑使用datetime
模块,而不是使用UNIX纪元的偏移量;它可以让你处理时间戳而不必担心时区考虑因素,这完全可以满足你的需求:
>>> import datetime
>>> datetime.datetime.strptime(sample, pattern)
datetime.datetime(2014, 4, 11, 10, 13, 36)
如果你必须传递时间戳(自UNIX纪元以来的秒数),你可以用datetime.datetime.fromtimestamp()
将它们转换为datetime对象:
>>> datetime.datetime.fromtimestamp(1397207617)
datetime.datetime(2014, 4, 11, 10, 13, 37)
通过解释计算机本地时区中的值,为您提供datetime
个对象。