为世界各地的各种纬度/长度位置拉ephem.next_rising(太阳)

时间:2014-10-03 04:17:08

标签: python timezone pytz pyephem

我想设置一个Python程序,以便能够从各个位置拉出日出/日落,以触发本地位置的灯光,以象征远程日出,如果你真的在那里。 我的意思是,如果你住在柏林,而你在12月中旬的日出/日落时间是早上7点45分/下午4点15分,那么当一些热带日出发生时,你可能会有一个点亮的LED(比如夏威夷) )。但这是对你当地时间的反应。

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

我使用温哥华,不列颠哥伦比亚省和法国圭亚那乔治城作为测试案例设置了一个测试程序,它主要起作用 - 但乔治城的日出/日落是完全错误的。

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

尽管如此,你会看到Guyana.date是绝对正确的,但是日出/日落就像下午1:53 AM / 13:57,这完全被打破了。 关于如何变得如此可怕,可怕的错误的任何想法?

已编辑删除不必要的代码

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不仅仅是几个小时,而是在很多方面关闭。

1 个答案:

答案 0 :(得分: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 documentation

  

日期始终使用世界时,从不您当地的时区。

正如我所说in my answer to your previous question

  

您应该将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(始终)。正如I said

  

你应该使用time.time()代替time.mktime(time.localtime()),后者可能会在DST过渡期间返回错误的结果。

以UTC格式查找当前时间的正确方法是:

utc_dt_naive = datetime.utcnow()

或者如果您需要知道日期时间对象:

utc_dt = datetime.now(utc_timezone)