【问题标题】:Python fromtimestamp() method inconsistentPython fromtimestamp() 方法不一致
【发布时间】:2016-09-29 16:21:16
【问题描述】:

我从 WSO2 DAS 获取数据,其中包含 Unix 时间戳。我一直在使用 PyCharm 开发这个网站。我主要在 Windows 10 机器上开发,偶尔在 MAC 上进行开发,并在 Linux 机器上进行部署。

我有一个相当简单的用例,我想从 WSO2 获取日期,将其转换为人类可读的本地时间,并将其显示给用户。我看到的问题是使用 Python 在 Windows 和 MAC 机器上转换时间戳的不同结果。

# Convert the millisecond time stamp to seconds
ts = int(hit['timestamp']) / 1000 

# Convert the timestamp to a human readable format
ts = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')

fromtimestamp() 方法的 python 文档说明如下:

date.fromtimestamp(时间戳) 返回 POSIX 时间戳对应的本地日期,如 time.time() 返回的。如果时间戳超出平台 C localtime() 函数支持的值范围,这可能会引发 ValueError。这通常被限制在从 1970 年到 2038 年的年份。请注意,在时间戳概念中包含闰秒的非 POSIX 系统上,fromtimestamp() 会忽略闰秒。

该文档可以在这里找到:https://docs.python.org/2/library/datetime.html

现在这在我的 Windows 机器上完美运行。

Windows 上的第 1 行结果:1474560434.73

将其插入时间戳转换器会导致:

格林威治标准时间:格林威治标准时间 2016 年 9 月 22 日星期四 16:07:14

您的时区:2016 年 9 月 22 日上午 11:07:14 GMT-5:00 DST

完美!所以我预计第二行的结果是 2016-09-22 11:07:14。这可以直接从我的代码中看到:

Windows 上的第 2 行结果:'2016-09-22 11:07:14'

现在是乐趣的开始。我的 MAC 上有完全相同的代码,也是从 PyCharm 运行的。运行相同的代码,第一行的结果是:

MAC 上的第 1 行结果:1474560434.73

同上,我们预计时间是 9 月 22 日上午 11:07:14。

MAC 上的第 2 行结果:'2016-09-22 16:07:14'

不好。这是结果,仍然是 UTC。

我已确认两台计算机都设置为我的本地时区。 更奇怪的是,在尝试调试此问题时,我发现了以下结果:

t = time.localtime()
u = time.gmtime(time.mktime(t))
offset = timegm(t) - timegm(u)

在我的 MAC 上的终端中运行上述代码会给出正确的本地时间 (UTC-5)、正确的 UTC 时间和 -18000 的偏移量(这是正确的)。但!在我的 MAC 上的 PyCharm 中运行相同的代码会产生零偏移,并显示本地时间和 UTC 时间相同。

我最初对为什么我的 Windows 机器与 MAC 上的结果不同感到困惑,但可以假设这是操作系统的差异。但现在我看到 MAC 终端与 MAC PyCharm 的差异。我只能假设我的 MAC 机器引用了正确的时区(这就是它在终端中工作的原因),但 PyCharm 引用了其他时区位置并认为它是 UTC。

【问题讨论】:

  • 我将首先比较您在 pycharm shell 和 OS 终端中的环境变量。

标签: python macos datetime pycharm


【解决方案1】:

Python 可能使用来自 OS/shell 环境的 TZ。

PyCharm 似乎使用了 settings.py 文件中的 TIME_ZONE。 Here 是完整的时区列表。试试看。

【讨论】:

  • 这是一些很棒的信息。不检查 settings.py 文件中的类似内容让我感到很愚蠢。也就是说,在我的 Windows 10 机器(这是我目前唯一可以访问的机器)上,TIME_ZONE = "UTC" - 所以我预计这台机器也会有同样的问题。也就是说,我将能够在一个小时左右的时间内在我的 MAC 上进行确认。
  • 是的,这已经结束了。所以我的猜测是我在考虑这个倒退。 Windows 10 做错了什么 - 它应该以 UTC 显示日期,因为那是 settings.py 设置。 MAC 做得对,但不是我想要的结果。将设置更改为我的时区就像一个魅力。感谢您的帮助。
猜你喜欢
  • 2016-09-26
  • 2011-09-28
  • 2012-01-04
  • 1970-01-01
  • 2012-04-12
  • 2016-08-22
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多