时间戳比UTC快一小时,应该是UTC+1
我写了一个模块,用来生成在特定时间内事件发生的百分比概率。我的数据库里有事件生成的时间戳。我把这个时间戳从“年-月-日 时-分-秒”的格式转换成了纪元时间(epoch time)。我得到的纪元时间是以UTC(格林威治标准时间)为准的,而我的时区是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))
1 个回答
1
time.mktime()
这个函数是 time.localtime()
的反向操作,也就是说你解析的时间会被当作 UTC(协调世界时)来处理,然后再转换成你所在的本地时区。
你这里需要用的是 time.gmtime()
的反向操作,而这个功能在一个不同的模块里,叫做 calendar.timegm()
函数:
>>> 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
与其使用 UNIX 纪元的时间偏移,不如考虑使用 datetime
模块;这样你就可以处理时间戳,而不用担心时区的问题,这对你的需求来说是完全可以的:
>>> 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
对象,它会根据你机器的本地时区来解释这个值。