如何计算日出/日落时间?

时间:2009-04-01 04:40:53

标签: time astronomy

我喜欢跟踪日出和日落时间。在过去的几年里,我一直在用一个用我最喜欢的编程语言的流行库编写的小程序来做这件事。过去两个月我比往常更频繁地跟踪这些时间,我偶然注意到在春分日,日出时间比前一天增加了8分钟!我知道这是不可能的,与NOAA比较,发现我的上升和设定时间已经关闭了好几天,实际上一年中的大部分时间似乎已经消失了大约一分钟。

此时,我想自己实施计算。有哪些算法或公式可用于此计算?

8 个答案:

答案 0 :(得分:8)

您可以考虑阅读维基百科关于sunrise equations的文章。主要段落给出了等式:

其中:

  • ω o 是度数(°)中日出时(采取负值时)或日落(采取正值时)的度数hour angle
  • φ是地球上观察者的纬度(度)
  • δ是以度为单位的太阳declination

答案 1 :(得分:7)

如果你想匹配NOAA,你必须咨询Jean Meeus的 Astronomical Algorithms (主要是第15章)。它很复杂!马丁贝克特是正确的,你必须定义日落。通常这是太阳上肢的明显上升或上升,这使得你的“标准”altitide -5/6度(不为零)。并且您无法直接使用NOAA的准确度来计算日出或日落。你必须为有关日期的明显右上升和下降创建一套控制方程式,然后在一段时间内插入明显的右上升和下降,以找到标准高度的确切上升和设定时间。

希望这会有所帮助。当我遇到同样的事情时,我花了大约一个月的时间消化了 AA 并重新编写了我们所有的太阳能代码,而且我还需要一年多的时间来解决我的代码破坏的一些极端情况。因此需要一些时间来弄明白。我不知道这个算法的任何公共代码示例,此时没有任何共享,但如果可以,我很乐意帮助您解决一些令人头疼的问题。

答案 2 :(得分:4)

对于5分钟范围内的准确度,您必须考虑'which' sunset 你想要时间太阳的底部接触地平线还是太阳顶部通过地平线以下的时间?

太阳穿过地平线需要2分钟 在1分钟以下,您还需要考虑大气折射。

答案 3 :(得分:4)

日出/日落的定义可能有所不同。例如,在ephem中,“上升和设置被定义为身体上肢接触地平线的时刻(即,当身体的alt加上半径等于零时)”[PyEphem Quick Reference]

#!/usr/bin/env python
import datetime
import ephem # to install, run `pip install pyephem`

o = ephem.Observer()
o.lat, o.long, o.date = '34:3', '-118:15', datetime.datetime.utcnow()
sun = ephem.Sun(o)
print "Los Angeles"
print "sunrise:", o.next_rising(sun), "UTC"
print "sunset:",o.next_setting(sun), "UTC"

输出

Los Angeles, CA
sunrise: 2010/3/30 13:42:43 UTC
sunset: 2010/3/30 02:11:50 UTC

如果它是开源库,那么你可以修复它,而不是创建一个带有新bug的新文件。

答案 4 :(得分:3)

看看这本书:
Peter Duffett-Smith撰写的“实用天文学与你的计算器(平装本)” 它已经相当陈旧但仍在印刷中...... link

答案 5 :(得分:2)

在Ruby中,我写了这个时间等式。

include Math

# degrees to radians = PI/180
to_r = PI/180.0

#radians to degrees = 180/PI
to_d = 180.0/PI

puts "Day, Declination, EofT"

# test a celestial year worth of values.
for jday in 1..366

  et = -7.633 * sin(jday * (2 * PI)/365.24) + 9.65 * sin((jday - 78) * 180/92 * to_r)
  a_sin = sin(23.433 * to_r) * sin((2 * PI/366) * (jday - 81))
  declination = asin(a_sin) * to_d
  puts "#{jday}, #{declination}, #{et}"

end

然后对于上面的等式:

# center disk and refraction factor have been considered.
cos_omega = sin(-0.83 * to_r) - tan(latitude * to_r) * tan(declination * to_r)
semi_diurnal_arc = acos(cos_omega)

http://www.analemma.com/

有一整个网站专门讨论这个问题
  • 这些计算的关键是好的库,就像上面的python那样。
  • 还使用日期和时间类。我会在rubyforge上寻找像ephem这样的东西。

答案 6 :(得分:0)

我确实在“技术定义和计算详细信息”标题下的this NOAA page上看到了一些有趣的东西,但我相信你已经读过了。

SO问题“Position of the sun given time of day, and lat/long”以及上述问题的答案实际上可能就是您所需要的。

作为附注(它没有直接回答你的问题),是否有理由不能提取NOAA数据并将其用作查找表而不是计算它?如今,存储往往相对便宜。

答案 7 :(得分:0)

You might want to look at an earlier entry on calculating the position of the sun.具体来说,我指出的Solpos程序支持日出/日落。