<p>您可以不使用<code>math.floor()</code>重写它:</p>
<pre><code>def jdate(year, month, day, hour, minute, second):
day_fraction = ((second + 60 * minute) + 3600 * hour) / 86400.
return (367 * year - (7 * (year + (month + 9) // 12)) // 4 +
275 * month // 9 + day + (1721013.5 + day_fraction))
</code></pre>
<p>您可以简化它;如果您使用<code>datetime</code>算术:</p>
^{pr2}$
<p>要将<code>datetime</code>对象传递给<code>jdate()</code>,可以使用<code>.timetuple()</code>方法:</p>
<pre><code>import math
for time_tuple in [(1961, 1, 1), (1968, 2, 1), (1972, 1, 1), (1996, 1, 1)]:
dt = datetime(*time_tuple)
a, b = jdate(*dt.timetuple()[: 6]), JD(dt)
print("{} UTC -> {} JD(UTC)".format(dt, b))
assert math.isclose(a, b), (a, b)
</code></pre>
<p>另外,如果需要,可以使用<code>dt.year</code>、<code>dt.month</code>、<code>dt.day</code>等属性。在</p>
<h3>输出</h3>
<pre><code>1961-01-01 00:00:00 UTC -> 2437300.5 JD(UTC)
1968-02-01 00:00:00 UTC -> 2439887.5 JD(UTC)
1972-01-01 00:00:00 UTC -> 2441317.5 JD(UTC)
1996-01-01 00:00:00 UTC -> 2450083.5 JD(UTC)
</code></pre>
<p>根据<a href="http://www.iers.org/nn_10910/IERS/EN/Science/Recommendations/resolutionB1.html" rel="nofollow noreferrer">IERS web-site where a recommended "Julian Date" definition is provided</a>,这是正确的。在</p>
<hr/>
<p>对于1900年3月之前和2100年2月之后的日期,公式得出了不同的结果:</p>
<pre><code>import jdcal # pip install jdcal
import astropy.time # pip install astropy
print(" UTC | matlab | datetime | astropy | jdcal")
for year in [1900, 2000, 2100]:
for time_tuple in [(year, 2, 28, 12), (year, 3, 1, 12)]:
dt = datetime(*time_tuple)
matlabJD = jdate(*dt.timetuple()[:6])
datetimeJD = JD(dt)
jdcalJD = sum(jdcal.gcal2jd(*dt.timetuple()[:3])) + .5
astropyJD = astropy.time.Time(dt)
print("{dt} | {matlabJD} | {datetimeJD} | {astropyJD.jd} | {jdcalJD}"
.format(**vars()))
</code></pre>
<h3>输出</h3>
<pre><code> UTC | matlab | datetime | astropy | jdcal
1900-02-28 12:00:00 | 2415078.0 | 2415079.0 | 2415079.0 | 2415079.0
1900-03-01 12:00:00 | 2415080.0 | 2415080.0 | 2415080.0 | 2415080.0
2000-02-28 12:00:00 | 2451603.0 | 2451603.0 | 2451603.0 | 2451603.0
2000-03-01 12:00:00 | 2451605.0 | 2451605.0 | 2451605.0 | 2451605.0
2100-02-28 12:00:00 | 2488128.0 | 2488128.0 | 2488128.0 | 2488128.0
2100-03-01 12:00:00 | 2488130.0 | 2488129.0 | 2488129.0 | 2488129.0
</code></pre>
<p>你问题中的公式认为<code>jdate()</code>,<code>1900</code>,<code>2100</code>是闰年。<code>datetime</code>实现、<code>astropy</code>和{<cd14>}库在这里产生相同的结果。在</p>
<p>注意:Julian<em>day</em>是一个整数。<code>JD()</code>计算包含一天的分数的Julian<em>日期</em>,请参见<a href="https://stackoverflow.com/a/25831416/4279">definitions in the links</a>。在</p>
<p>正如链接讨论中提到的,您应该使用已经制作好的库,并在必要时发送补丁,而不是重新设计轮子,以避免由于闰年、浮点问题、错误的时间刻度、儒略日定义上的细微差异等而产生的简单错误</p>