<p>免责声明:此答案使用的是公历,而不是波斯历</em></p>
<h2>使用标准库</h2>
<p>使用模块<a href="https://docs.python.org/3/library/datetime.html" rel="nofollow noreferrer">datetime</a>:为一月一日定义一个<code>datetime.date</code>对象,添加一个带有输入天数的<code>datetime.timedelta</code>对象,并检查结果<code>datetime.date</code>对象的月份和日期</p>
<pre class="lang-py prettyprint-override"><code>import datetime
def get_month_day(numday):
d0 = datetime.date(2021,1,1)
deltaT = datetime.timedelta(numday)
d = d0 + deltaT
return d.month, d.day
</code></pre>
<h2>使用硬编码算法</h2>
<p>不幸的是,代码中类似<code>numday // 31 +1</code>的逻辑不可能工作。原因是有些月份有31天,有些月份有30天,而二月只有28天。或29</p>
<p>我们需要硬编码每月的天数。然后我们将累积这些天数,得到每个月最后一天的天数;最后,我们将比较我们的天数和这些数字。我们可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.accumulate" rel="nofollow noreferrer">^{<cd5>}</a>。如果您对标准库中的模块过敏,可以编写自己的<code>accumulate</code>函数来获取列表的累积和</p>
<pre class="lang-py prettyprint-override"><code>import itertools
def get_month_day(numday):
assert(0 <= numday < 365)
month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
cumulative = list(itertools.accumulate(month_lengths, initial=0))
for month, endofmonth_numday in enumerate(cumulative):
if numday < endofmonth_numday:
return month, numday - cumulative[month-1] + 1
</code></pre>