如何创建不调整本地时间的unix时间戳?

5 投票
1 回答
1536 浏览
提问于 2025-04-16 01:43

我有一些UTC时间的日期时间对象,现在想把它们转换成UTC时间戳。问题是,time.mktime这个函数会根据本地时间进行调整。

下面是一些代码:

import os
import pytz
import time
import datetime

epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1))
print time.mktime(epoch.timetuple())

os.environ['TZ'] = 'UTC+0'
time.tzset()
print time.mktime(epoch.timetuple())

这是一些输出结果:

Python 2.6.4 (r264:75706, Dec 25 2009, 08:52:16) 
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import pytz
>>> import time
>>> import datetime
>>> 
>>> epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1))
>>> print time.mktime(epoch.timetuple())
25200.0
>>> 
>>> os.environ['TZ'] = 'UTC+0'
>>> time.tzset()
>>> print time.mktime(epoch.timetuple())
0.0

显然,如果系统设置为UTC时间,那就没问题,但如果不是,就会出现问题。设置环境变量并调用time.tzset可以解决这个问题,但这样做安全吗?我不想影响整个系统的时间设置。

有没有其他方法可以做到这一点?或者这样调用time.tzset真的安全吗?

1 个回答

6

calendar模块里有一个叫做calendar.timegm的功能,可以解决这个问题。

calendar.timegm(元组)

这个功能虽然和问题无关,但很实用。它可以接收一个时间元组,这个元组是由gmtime()函数返回的,gmtime()函数在time模块里。然后,它会返回一个对应的Unix时间戳,假设时间从1970年开始,并且使用POSIX编码。实际上,time.gmtime()timegm()是互为反函数。

撰写回答