纪元时间距UTC一小时,应为UTC + 1

时间:2014-04-11 09:47:31

标签: python datetime time epoch

我编写了一个模块,可以在特定时间内生成事件发生的百分比。我的数据库有一个生成事件的时间戳。我正在将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))

1 个答案:

答案 0 :(得分:1)

time.mktime() functiontime.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个对象。