2014-10-03 82 views
1

我想设置一个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不仅仅是几个小时,但在很多方面都关闭了。

回答

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 

上午05点40本地时间似乎是合理的日出。


ephem documentation

日期总是使用通用时间,从未当地时区。

正如我所说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) 
+0

这是什么,你的生活是看跌期权做你进入如此多的UTC知识的路径? :) 幸运的是,在幼稚和意识之间,我计划在遥远的日落时间使用的所有时区都是赤道,并且不使用夏令时(谢天谢地)。我认为现在无论发生什么问题,或许与埃塞俄比亚有更多关系,因为圭亚那的日期/时间是正确的,但日出显然是凌晨1点53分。 – Octoth0rpe 2014-10-03 13:26:47

+0

@ Octoth0rpe:对不起,但它不是我。这是'ephem'的文档,需要UTC时区(我已经添加了直接引用的答案)。假设'ephem','pytz','datetime'是正确的,并且你使用它们是错误的 - 库中存在错误,但实际错误更可能在代码中,直到你有更多的经验。关于圭亚那:将日出时间设为UTC,然后将其转换为圭亚那的时区(上午1:53是什么时候?是在圭亚那时区的UTC时间的本地时区?) – jfs 2014-10-03 13:45:40

+0

谢谢JF,我没有即使是讽刺,我也很认真。在UTC /日期时间等所有不同风格周围摆弄的数量让我感到不知所措,而且我受到一个与他们一样大脑围绕它的人的谦卑。关于圭亚那1:53上午日出的奇怪之处在于它几小时甚至几分钟都没有关闭。今天的日出实际上是上午5点40分,但是ephem正在报告它在1:53发生。 – Octoth0rpe 2014-10-04 16:19:48