如果在Python中运行程序时更改了当前本地时间,该怎么办?

时间:2014-09-11 11:38:41

标签: python datetime python-3.x

我正在编写一个程序,如果它已经改变,应该定期记录机器本地时间与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。

2 个答案:

答案 0 :(得分:0)

首先尝试使用time.tznameimport time)。

如果这不起作用,则需要调用此Windows API函数:GetTimeZoneInformation()。它由Python for Windows Extensions公开,或者您可以通过ctypes调用它。

答案 1 :(得分:0)

  

问题是datetime.datetime.now()返回的时间似乎   始终位于首次导入日期时间的时区,   而不是当前的时区。

从技术上讲,由于tzinfoNone,因此时间未定义。或者正如python文档所称,“天真”:

  

时间或日期时间类型的对象可能是天真的或有意识的。日期时间   对象d知道d.tzinfo是不是None而d.tzinfo.utcoffset(d)   不返回无。如果d.tzinfo为None,或者d.tzinfo不是None   但是d.tzinfo.utcoffset(d)返回None,d是天真的。

当然,如果您希望now反映时区,则需要将时区传递给它。

可以从time.localtimetime.timezonetime.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