1

我想设置一个 Python 程序,以便能够从各个位置提取日出/日落,以触发本地位置的灯光,以象征远程日出——如果你真的在那里。我的意思是,如果您住在柏林,并且您在 12 月中旬的日出/日落时间是上午 7:45/下午 4:15,那么您可以有一个小 LED,当一些热带日出发生时会亮起(比如夏威夷)。但这是根据您自己的当地时间而发生的。

因此,使用 Python 的 ephem、pytz 和 localtime,提取各个位置的日出/日落信息,并根据每个位置触发事件。

我已经使用不列颠哥伦比亚省的温哥华和法属圭亚那的乔治敦作为测试用例建立了一个测试程序,它大部分都有效——但乔治敦的日出/日落是完全错误的。

您可以将整个内容剪切并粘贴到 Python 窗口中进行测试,请原谅无关的时间调用,但我发现查看每个时间调用的内容很有趣。

尽管如此,您会看到 Guyana.date 是绝对正确的,但日出/日落时间大约是 1:53 AM / 13:57 PM,完全被破坏了。关于这怎么会变得如此可怕,可怕的错误的任何想法?

编辑删除不必要的代码

import ephem
from datetime import datetime, timedelta
from pytz import timezone
import pytz
import time 

Guyana = ephem.Observer()
Guyana.lat = '5'
Guyana.lon = '58.3'
Guyana.horizon = 0
Guyana.elevation = 80 
Guyana.date = datetime.utcnow()

sun = ephem.Sun()


print("Guyana.date is ",Guyana.date)
print("Guyana sunrise is at",Guyana.next_rising(sun))
print("Guyana sunset is going to be at ",Guyana.next_setting(sun))

结果如下:

Guyana.date is  2014/10/4 16:47:36
Guyana sunrise is at 2014/10/5 01:53:26
Guyana sunset is going to be at  2014/10/5 13:57:05

这有什么问题,今天圭亚那的实际日出是早上 5 点 40 分,所以 1 点 53 分 26 秒不仅仅是几个小时,而是在很多方面。

4

1 回答 1

2

要回答您的更新版本:正经度指的是东部,但圭亚那(美国)是格林威治的西部,因此您应该使用减号:Guyana.lon = '-58.3'然后日出时间变为:

Guyana sunrise is at 2014/10/5 09:39:47

时间为 UTC,您可以将其转换为当地(圭亚那)时间:

>>> utc_dt = Guyana.next_rising(sun).datetime().replace(tzinfo=pytz.utc)
>>> print(utc_dt.astimezone(pytz.timezone('America/Guyana')))
2014-10-05 05:39:46.673263-04:00

当地时间上午 5:40 日出似乎是合理的。


ephem文档

日期始终使用世界时,而不是您的本地时区。

正如我在回答您上一个问题时所说:

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

即,Vancouver.date = now是错误的,因为您使用datetime.now()它返回一个幼稚的本地时间(通过datetime.utcnow()(或ephem.now())代替),Guyana.date = utc_dt.astimezone(FrenchGuyanaTZ)这是错误的,因为FrenchGuyanaTZ时区可能具有非零的 UTC 偏移量(只是通过utc_dt)。

不相关:找到当前时间的时间戳的正确方法是time.time()gmNow应该等于timetimeNow(总是)。正如我所说

您应该使用time.time()而不是time.mktime(time.localtime())后者可能会在 DST 转换期间返回错误的结果。

在 UTC 中查找当前时间的正确方法是:

utc_dt_naive = datetime.utcnow()

或者,如果您需要有意识的日期时间对象:

utc_dt = datetime.now(utc_timezone)
于 2014-10-03T07:13:34.317 回答