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

25

我喜欢追踪日出和日落时间。过去几年,我一直使用我喜爱的编程语言中流行的库编写的小程序来实现这一点。最近两个月里,我比平时更经常地跟踪这些时间,并注意到在春分的那天,日出时间比前一天提前了八分钟!我知道这是不可能的,于是与NOAA进行比较,发现我的升起和降落时间已经错误了好几天,并且事实上,大部分时间似乎都偏了约一分钟。

此时此刻,我想自己实现这些计算。有哪些可用的算法或公式可以进行这种计算呢?


8
老实说,Jason,我不确定我是否还属于这里。我已经厌倦了发现我一年前提出的问题被盗用并发布到其他网站上。这不是一个编程问题吗? - skiphoppy
1
如果它们被“黑客攻击”或被拉到其他网站上,那是有原因的。你会走进银行问出纳员加油价格吗?我只是不相信这是一个编程问题,现在仍然不相信。没有提到任何与编程有关的内容,只有算法和计算。有一个专门的网站可以解决这个问题。你还将你的问题标记为“天文学”。也有一个专门的网站。这并不意味着你的问题不好或无效,只是在错误的场合。 - Jason
1
要获得类似NASA的精度,请使用CSPICE库:http://naif.jpl.nasa.gov/naif/tutorials.html 如果您在astronomy.stackexchange.com上重新提出这个问题,我可以给您一个更完整的答案(我不想回答一个已关闭的问题)。 - user354134
嘿,我知道我来晚了,但我已经编写了一个MATLAB函数,可以在NOAA网站上计算日出和日落时间。请访问此链接:https://dev59.com/QqDha4cB1Zd3GeqP_zTA#42938070 - Richard
你可能想考虑使用Skyfield Python库。使用示例:https://astronomy.stackexchange.com/a/30141 - Caesar
8个回答

11

您可以考虑阅读维基百科关于日出方程的文章。引言段给出了方程式:

cos(ωo) = -tan(φ) * tan(δ)

其中:

  • ωo是在日出(取负值)或日落(取正值)时的时角,以度(°)为单位
  • φ是观测者在地球上的纬度,以度为单位
  • δ是太阳赤纬,以度为单位

3
如果发帖者担心1分钟的差异,你需要比球体地球近似模型做得更好。 - Martin Beckett

8
如果您想要匹配NOAA,您需要参考Jean Meeus的《天文算法》(主要是第15章)。而这很复杂!Martin Beckett是正确的,您必须定义日落。通常,这是太阳上肢的显著升起或落下,这使您的“标准”高度为-5/6度(不是零)。而且,您无法直接使用NOAA的精度计算日出或日落。您将不得不为所研究的那一天创建一个明显的赤经和赤纬方程组,并在时间上插值明显的赤经和赤纬,以找到标准高度下的确切升起和落下时间。
希望这可以帮助您。当我遇到同样的问题时,我花了大约一个月的时间消化《AA》并重新编写了我们所有的太阳代码,但仍然需要超过一年的时间来解决我的代码崩溃的某些边角情况。因此,需要一些时间来弄清楚。我不知道有任何公共的该算法的代码示例,目前也没有可分享的,但如果可以的话,我很乐意帮助您解决一些头疼问题。

使用NOAA自己的算法怎么样(http://www.srrb.noaa.gov/highlights/sunrise/program.txt)。详细信息请参见http://www.srrb.noaa.gov/highlights/sunrise/calcdetails.html。 - Pat
@Pat,NOAA在此发布的算法可计算给定时间的太阳位置。这个问题是关于计算日出和日落时间,即为给定位置解决时间的问题。这两个问题相关但不是同一件事情! - mattexx
@mattexx 我不确定 JavaScript 中包含了什么,但我知道它驱动了他们的日出/日落计算器(http://www.srrb.noaa.gov/highlights/sunrise/sunrise.html),该计算器根据位置告诉日出/日落时间。就我所知,这正是 OP 想要做的事情。 - Pat
5
代码可以在http://www.srrb.noaa.gov/highlights/sunrise/sunrise.html找到,它只是JavaScript,所以“查看源代码”将显示所有内容。 - Pat
只是一点小提示。我花了一些时间仔细阅读了@Pat答案中的整个JavaScript代码,却没有注意到这里有更新版本:https://www.esrl.noaa.gov/gmd/grad/solcalc/ 。请不要像我一样匆忙使用旧计算器。 - Kar.ma
显示剩余3条评论

4

日出和日落的定义因国家不同而异。例如,在ephem中,“日出和日落被定义为当物体的上肢接触地平线时刻(也就是当物体的高度加半径等于零时)”【PyEphem 快速参考】

#!/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

如果是开源库,你可以修复它而不是创建一个新的带有新错误的库。


1
如果它是开源库,那么你可以修复它,而不是创建一个新的带有新错误的库。 <3 - Radek Postołowicz

4

要在5分钟范围内获得准确时间,您需要考虑“哪个”日落时间。点击此处了解更多信息。
您是想知道太阳底部接触地平线的时间还是太阳顶部下降到地平线以下的时间?

太阳穿过地平线需要2分钟的时间。
在1分钟以下的范围内,您还需要考虑大气折射的影响。


1
太阳穿过地平线的时间并非在全球各地都是两分钟。 - user317955
1
太阳升起或落下需要超过43个小时:http://astronomy.stackexchange.com/questions/12824/how-long-does-a-sunrise-or-sunset-take - user354134

3
请看这本书:
《使用计算器进行实用天文学(平装)》彼得·达菲特-史密斯著。
这本书虽然很老,但仍在印刷中... 链接

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的东西。

尝试使用astro-algo - mattexx

0

我在这个NOAA页面的技术定义和计算细节部分看到了一些有趣的东西,但我相信你已经读过了。

对于SO问题“给定时间和纬度/经度的太阳位置”,上面提到的可能是你所需要的全部内容。

顺便说一句(它并没有直接回答你的问题),你不能拉取NOAA数据并将其用作查找表而不是计算吗?存储成本现在相对较低。


我喜欢查找表的方法,但我想知道如何在代码中实现它,同时我想知道我使用的数据背后的算法是什么,因为我之前使用的东西出了点问题。 - skiphoppy
另外,我还在尝试用算法替换春分、秋分的查找表。 :) - skiphoppy
如果纬度和经度是任意的,我认为查找表不起作用。关于春分和秋分,请参考:http://astronomy.stackexchange.com/questions/13008/are-there-accurate-equinox-and-solstice-predictions-for-the-distant-past - user354134

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接