Следующий скрипт вычислит время восхода, захода солнца и сумерек с помощью PyEphem. Комментарии должны быть адекватными, чтобы объяснить, что делает каждая часть.
import ephem
#Make an observer
fred = ephem.Observer()
#PyEphem takes and returns only UTC times. 15:00 is noon in Fredericton
fred.date = "2013-09-04 15:00:00"
#Location of Fredericton, Canada
fred.lon = str(-66.666667) #Note that lon should be in string format
fred.lat = str(45.95) #Note that lat should be in string format
#Elevation of Fredericton, Canada, in metres
fred.elev = 20
#To get U.S. Naval Astronomical Almanac values, use these settings
fred.pressure= 0
fred.horizon = '-0:34'
sunrise=fred.previous_rising(ephem.Sun()) #Sunrise
noon =fred.next_transit (ephem.Sun(), start=sunrise) #Solar noon
sunset =fred.next_setting (ephem.Sun()) #Sunset
#We relocate the horizon to get twilight times
fred.horizon = '-6' #-6=civil twilight, -12=nautical, -18=astronomical
beg_twilight=fred.previous_rising(ephem.Sun(), use_center=True) #Begin civil twilight
end_twilight=fred.next_setting (ephem.Sun(), use_center=True) #End civil twilight
Перемещение горизонта объясняет преломление света вокруг кривизны Земли. PyEphem имеет возможность вычислить это более точно, учитывая температуру и давление, но военно-морской астрономический альманах США предпочитает игнорировать атмосферу и просто перемещать горизонт. Я ссылаюсь на USNAA здесь, потому что это авторитетный источник, по которому можно проверить подобные вычисления. Вы также можете проверить ответы на сайте NOAA .
Обратите внимание, что PyEphem принимает и возвращает значения в UTC времени. Это означает, что вам нужно преобразовать ваше местное время в UTC, а затем преобразовать UTC обратно в местное время, чтобы найти ответы, которые вы, вероятно, ищете. На дату, когда я написал этот ответ, Фредериктон, Канада, в часовом поясе ADT отставал на 3 часа от UTC.
Для ударов я также добавил расчет солнечного полдня. Обратите внимание, что это дополнительный час от ожидаемого - это побочный эффект от использования нами летнего времени.
Все это возвращает:
begin civil twilight: 2013/9/4 09:20:46
sunrise: 2013/9/4 09:51:25
noon: 2013/9/4 16:25:33
sunset: 2013/9/4 22:58:49
end civil twilight: 2013/9/4 23:29:22
Обратите внимание, что нам нужно вычесть 3 часа, чтобы преобразовать их в часовой пояс ADT.
Эта страница документации PyEphem содержит большую часть вышеперечисленного, хотя я постарался уточнить и те моменты, которые мне показались запутанными, и включить важные части этой ссылки здесь, в StackOverflow.