【问题标题】:localtime not actually giving localtimelocaltime 实际上并没有给出本地时间
【发布时间】:2014-09-19 13:25:57
【问题描述】:

显然有一个时间模块可以解决这个问题,但我还没有找到它。 我只是想在 Raspberry Pi 上使用 Pyephem 来找出我的纬度经度坐标的日出和日落时间。 代码很简单:

import ephem
import datetime 
import time
now = datetime.datetime.now()
gmNow = time.mktime(time.localtime()) 
Vancouver = ephem.Observer()
Vancouver.lat = 49.2878
Vancouver.horizon = 0
Vancouver.lon = -123.0502
Vancouver.elevation = 80
Vancouver.date = now
# Vancouver.date = time.localtime()

sun = ephem.Sun()

print("sunrise is at",ephem.localtime(Vancouver.next_rising(sun)))
print("sunset is going to be at ",ephem.localtime(Vancouver.next_setting(sun)))
print("now is ",now)
print("gmNow is",gmNow)

什么导出,但运行时错误是 8 小时。所以看起来 ephem.localtime() 实际上并没有运行。

pi@raspberrypi ~ $ sudo python3 vivarium_sun.py 
sunrise is at 2014-09-19 12:55:56.000004
sunset is going to be at  2014-09-19 00:52:30.000004
now is  2014-09-19 06:22:24.014859
gmNow is 1411132944.0

这让我发疯了,而且一旦弄清楚它显然就是那些简单的事情之一,所以我要在这里讨论蜂巢思维。

编辑** 只需在 Raspberry Pi 的命令行中输入“日期”即可返回以下内容:

pi@raspberrypi ~ $ date
Fri Sep 19 18:41:42 PDT 2014

这是准确的。

【问题讨论】:

  • 您应该使用time.time() 而不是time.mktime(time.localtime()),后者可能会在夏令时转换期间返回错误结果。
  • Python 依赖于您的操作系统设置来确定本地时间的含义。因此,我们应该首先将 Python 排除在外:如果您在 Raspberry Pi 上键入命令 date,它的输出是什么 - 您可以将其粘贴到我们的问题中吗?
  • 是的,您可以从底部第二条的“现在是..”评论中看到 datetime.datetime.now() 正在返回准确的本地时间。此外,命令行中的日期或时间命令返回精确到本地时间。
  • 另外,time.mktime(time.localtime()) 和 time.time() 的结果之差是 gmNow 是 1411178199.0 timetimeNow 是 1411178199.284297

标签: python-3.x raspberry-pi pyephem


【解决方案1】:

您应该将datetime.utcnow() 传递给观察者,而不是您的当地时间。

ephem 期望 latitudelongitude 以弧度表示,如果作为浮点数传递,请改用字符串:

from datetime import datetime, timezone

import ephem

now = datetime.now(timezone.utc)
Vancouver = ephem.Observer()
Vancouver.lat = '49.2878'
Vancouver.horizon = 0
Vancouver.lon = '-123.0502'
Vancouver.elevation = 80
Vancouver.date = now
sun = ephem.Sun(Vancouver)

print("sunrise is at", ephem.localtime(Vancouver.next_rising(sun)))
print("sunset is going to be at ", 
      ephem.localtime(Vancouver.next_setting(sun)))
print("now is ",now.astimezone())

输出

sunrise is at 2014-09-20 06:55:38.000005
sunset is going to be at  2014-09-19 19:16:38.000004
now is  2014-09-19 19:15:04.171486-07:00

【讨论】:

  • 我加了这个,datetime.utcnow()的结果是错误:timeUTC = datetime.utcnow() AttributeError: 'module' object has no attribute 'utcnow'
  • 使用from datetime import datetime
  • 该死,不。日出在 2014-09-20 12:53:17.000005 日落将在 2014-09-20 00:54:27.000005 现在是 2014-09-20 02:01:28.962811 它将“现在”切换到 UTC 时间,但仍然失败
  • @Octoth0rpe:您还应该修正经度、纬度。我已经用完整的代码示例更新了答案
  • 是的!谢谢你。看?一些简单的东西。啊。 '为树之林'。我什至从未想过这一点,而是全神贯注地寻找其他日期时间、日期、时间日期等包。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多