拉ephem.next_rising(sun)在世界各地经纬度不同的地方
我想设置一个Python程序,能够从各个位置拉出日出/日落以触发本地位置的灯光来象征遥远的日出,因为它会 - 如果你真的在那里。 我的意思是,如果你住在柏林,而你在12月中旬的日出/日落时间是7:45 am/4:15pm,那么你可以在发生一些热带日出时点亮一些LED夏威夷)。但是,这是对当地时间的反应。拉ephem.next_rising(sun)在世界各地经纬度不同的地方
因此,使用Python的ephem和pytz,和本地时间,拉日出/日落各种位置的信息,并触发基于每个位置的事件。
我已经设置了使用温哥华和乔治城,法属圭亚那作为测试用例的测试程序,它主要作品 - 但日出/日落乔治敦是完全错误的。
您可以剪切,这整个事情粘贴到Python窗口进行测试,并请原谅外来时间调用,但是我觉得很有意思,看看每个时间呼叫拉。
尽管如此,你会看到的是,圭亚那日期是绝对正确的,但日出/日落是像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不仅仅是几个小时,但在很多方面都关闭了。
要回答你的更新版本:积极的经度是指东,但圭亚那(美国)是从格林威治西边因此,你应该使用负号: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
上午05点40本地时间似乎是合理的日出。
日期总是使用通用时间,从未当地时区。
正如我所说in my answer to your previous question:
你应该通过datetime.utcnow()的观察员,而不是你的本地时间。
即因为您使用datetime.now()
返回一个天真当地时间Vancouver.date = 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()
或者,如果您需要了解DateTime对象:
utc_dt = datetime.now(utc_timezone)
这是什么,你的生活是看跌期权做你进入如此多的UTC知识的路径? :) 幸运的是,在幼稚和意识之间,我计划在遥远的日落时间使用的所有时区都是赤道,并且不使用夏令时(谢天谢地)。我认为现在无论发生什么问题,或许与埃塞俄比亚有更多关系,因为圭亚那的日期/时间是正确的,但日出显然是凌晨1点53分。 – Octoth0rpe 2014-10-03 13:26:47
@ Octoth0rpe:对不起,但它不是我。这是'ephem'的文档,需要UTC时区(我已经添加了直接引用的答案)。假设'ephem','pytz','datetime'是正确的,并且你使用它们是错误的 - 库中存在错误,但实际错误更可能在代码中,直到你有更多的经验。关于圭亚那:将日出时间设为UTC,然后将其转换为圭亚那的时区(上午1:53是什么时候?是在圭亚那时区的UTC时间的本地时区?) – jfs 2014-10-03 13:45:40
谢谢JF,我没有即使是讽刺,我也很认真。在UTC /日期时间等所有不同风格周围摆弄的数量让我感到不知所措,而且我受到一个与他们一样大脑围绕它的人的谦卑。关于圭亚那1:53上午日出的奇怪之处在于它几小时甚至几分钟都没有关闭。今天的日出实际上是上午5点40分,但是ephem正在报告它在1:53发生。 – Octoth0rpe 2014-10-04 16:19:48