我正在编写一个程序,如果它已经改变,应该定期记录机器本地时间与UTC的偏移量。
我知道可以在程序启动时找到偏移量。这可以通过
来完成str(datetime.datetime.now()-datetime.datetime.utcnow())
或
str(datetime.datetime.now().replace(tzinfo=timezone.utc).astimezone())
或其他方法。
问题是datetime.datetime.now()返回的时间似乎始终位于首次导入日期时间的时区,而不是当前时区。也就是说,更改我机器上的本地时间并不会反映在datetime.datetime.now()给出的相同时间内。
举个例子,
import datetime
datetime.datetime.now()
报道' 2014-09-11 12:35:45.415104'。
我现在在机器上将时区更改为UTC + 4.
datetime.datetime.now()
仍在报道' 2014-09-11 12:35:50.407779'。
如何使用python在我的机器上获取当前时间(最好不使用外部库并以平台无关的方式)?
我在Windows 8上使用Python 3.4.1。
答案 0 :(得分:0)
首先尝试使用time.tzname
(import time
)。
如果这不起作用,则需要调用此Windows API函数:GetTimeZoneInformation()。它由Python for Windows Extensions公开,或者您可以通过ctypes
调用它。
答案 1 :(得分:0)
问题是datetime.datetime.now()返回的时间似乎 始终位于首次导入日期时间的时区, 而不是当前的时区。
从技术上讲,由于tzinfo
为None
,因此时间未定义。或者正如python文档所称,“天真”:
时间或日期时间类型的对象可能是天真的或有意识的。日期时间 对象d知道d.tzinfo是不是None而d.tzinfo.utcoffset(d) 不返回无。如果d.tzinfo为None,或者d.tzinfo不是None 但是d.tzinfo.utcoffset(d)返回None,d是天真的。
当然,如果您希望now
反映时区,则需要将时区传递给它。
可以从time.localtime
,time.timezone
和time.altzone
检索本地时区信息。 altzone
是本地时区的夏令时版本,当本地时间的tm_isdst
属性为1
时,您可以确定当前是否正在使用此版本:
import time
local_timezone = time.altzone if time.localtime().tm_isdst == 1 else time.timezone
返回的值是以秒为单位的UTC偏移量。因此,要获得当前datetime
,您可以从中构建timedelta
并从utcnow
中减去它:
import datetime
utc_offset = datetime.timedelta(seconds=local_timezone)
now = datetime.utcnow() - utc_offset
但是,出于您的目的,您似乎只需要监控上面local_timezone
的结果。
更新:显然,在Windows上,即使使用localtime()
,python仍然不会在执行期间反映时区更改。在Unix上,您可以调用tzset以确保它是最新的(虽然它通常会自动发生),但此功能在Windows上不可用。有关详情,请参阅this question。