2014-10-03 42 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