时间戳比UTC快一小时,应该是UTC+1

0 投票
1 回答
733 浏览
提问于 2025-04-18 02:19

我写了一个模块,用来生成在特定时间内事件发生的百分比概率。我的数据库里有事件生成的时间戳。我把这个时间戳从“年-月-日 时-分-秒”的格式转换成了纪元时间(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 对象,它会根据你机器的本地时区来解释这个值。

撰写回答