如何计算春分/秋分和夏至/冬至的时刻?

13
有哪些算法或公式可用于计算春分、秋分和冬至、夏至?几年前我找到了其中一种并实现了它,但精度不够:假设每个春分、秋分和冬至、夏至的时间为00:00、06:00、12:00和18:00 UTC。维基百科给出这些时间精确到分钟,因此可能有更准确的方法。我的编程语言中的库也以这些硬编码时间输出,因此我认为它们使用的是与我实现的算法相同或类似的算法。
我曾经尝试使用一个给我太阳黄经的库,并实现一个搜索程序来找到0、90、180和270度的确切时刻;这个方法可以精确定位到秒,但与维基百科上的时间不符,所以我认为这个方法存在问题。然而,我惊喜地发现,十世纪的犹太学者莫西·本·马蒙使用了完全相同的思路提出了一个算法。
4个回答

6

一个很好的(复杂的!)底层公式和算法的来源是Jean Meeus的Astronomical Algorithms

使用这些算法的PyMeeus实现,以及下面的代码,您可以获得2018年冬至(“冬季”指的是北半球)的以下值。

winter solstice for 2018 in Terrestrial Time is at:
 (2018, 12, 21, 22, 23, 52.493725419044495)

winter solstice for 2018 in UTC, if last leap second was (2016, 12):
 (2018, 12, 21, 22, 22, 43.30972542127711)

winter solstice for 2018 in local time, if last leap second was (2016, 12)
 and local time offset is -7.00 hours:
 (2018, 12, 21, 15, 22, 43.30973883232218)

i.e. 2018-12-21T15:22:43.309725-07:00

当然,答案并不精确到微秒级别,但我也想展示如何使用 arrow 进行高精度转换。 代码:
from pymeeus.Sun import Sun
from pymeeus.Epoch import Epoch

year = 2018  # datetime.datetime.now().year
target="winter"

# Get terrestrial time of given solstice for given year
solstice_epoch = Sun.get_equinox_solstice(year, target=target)

print("%s solstice for %d in Terrestrial Time is at:\n %s" %
      (target, year, solstice_epoch.get_full_date()))

print("%s solstice for %d in UTC, if last leap second was %s:\n %s" %
 (target, year, Epoch.get_last_leap_second()[:2], solstice_epoch.get_full_date(utc=True)))

solstice_local = (solstice_epoch + Epoch.utc2local()/(24*60*60))
print("%s solstice for %d in local time, if last leap second was %s\n"
 " and local time offset is %.2f hours:\n %s" %
 (target, year, Epoch.get_last_leap_second()[:2],
  Epoch.utc2local() / 3600., solstice_local.get_full_date(utc=True)))

使用非常酷的ISO和TZ感知模块Arrow:Python更好的日期和时间,可以更好地打印。
import arrow
import math

slutc = solstice_epoch.get_full_date(utc=True)
frac, whole = math.modf(slutc[5])

print("i.e. %s" % arrow.get(*slutc[:5], int(whole), round(frac * 1e6)).to('local'))

非常适合Python程序员。但不是所有人都适用。OP要求算法。我也在寻找公式或来源。 - Steffen Roller
1
足够正确。我添加了对Meeus书的引用。但是这些算法或公式可能更适合于http://astronomy.stackexchange.com/。 - nealmcb
1
嗯...“冬天”。我想这适用于北半球的冬天... - marisano

1

我不确定这是否是您需要的准确解决方案,但我发现了一个包含一些计算春分点以及其他天文学信息的代码片段的NASA网站。我还找到了一本名为Astronomical Algorithms的书的参考资料,如果在线上没有可用的信息,它可能有您所需的答案。


我之前看过那本书;如果还没有在线上获取那些信息的机会,我希望能够利用SO。 :) - skiphoppy
1
把它放在某个地方肯定是很好的!看起来算法相当复杂和专业化。 - Neil Williams
7
链接已失效。这就是为什么他们告诉你不要只是在这里随意发链接的原因。 - Rob

1

我知道你正在寻找适合粘贴到答案中的东西,但我必须提到SPICE,这是由JPL的NAIF制作的工具包,由NASA资助。它可能对于农民日历之类的东西来说有些过度,但你提到了对精度的兴趣,而这个工具包通常用于行星科学。


你能解释一下如何使用SPICE进行计算吗? - nealmcb

-2

我已经在C和Java中实现了Jean Meeus(上述天文算法的作者)的春分和秋分算法,如果您感兴趣。


我需要你用Java实现上述主题。你能分享一下吗?我的电子邮件是astroshoav.dev@gmail.com。谢谢。 - Kumar
4
请遵循标准的StackOverflow惯例,在你的回答中加入相关细节:计算答案的代码,可能需要使用特定的软件库等。 - nealmcb

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