algorithm将365天转换为一个月和一个月的某一天(波斯历)



大家好,我想写一个算法来将数字转换为日和月,例如,使用波斯日历,60表示30/2。

这是我找到的代码:

#1 Years = 12 month and 365 days
#Input
numday=int(input('Enter The Number [1 Until 365]: '))

if 0<numday<=186:
month =numday // 31 +1
day = numday % 31
print(' Month: ', month, 'n'
, 'Day: ', day,'n'
,month,'/',day)
if 186<numday<=366:
numday -= 186
month = numday // 30 +1 +6
day = numday % 30
print(' Month: ', month, 'n'
, 'Day: ', day, 'n'
, month, '/', day)

但是有一个问题,例如数字186,应该有另一个如果,因为它应该显示31/6而不是0/7,我找不到解决方案

免责声明:此答案使用公历,而不是波斯历

使用标准库

使用模块datetime:为1月1日定义一个datetime.date对象,添加一个带有输入天数的datetime.timedelta对象,并检查生成的datetime.date对象的月份和日期。

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

使用硬编码算术

不幸的是,代码中类似numday // 31 +1的逻辑不可能工作。原因是有些月份有31天,有些月份有30天,而二月只有28天。或者29。

我们需要对每月的天数进行硬编码。然后我们将累积这些天数,得到每个月最后一天的天数;最后,我们将把我们的天数与这些数字进行比较。我们可以使用itertools.accumulate。如果您对标准库中的模块过敏,可以编写自己的accumulate函数来获取列表的累积和。

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

既然你说你用的是波斯历。。。将月份四舍五入到上限的正确方法是使用math.ceil。你的一天不能是0,所以当你使用模运算符时,你需要把它设置为31。这是你前6个月的代码,有这2个变化:

import math
numday = int(input('Enter The Number [1 Until 365]: '))
if 0 < numday <= 186:
month = math.ceil(numday / 31)
day = numday % 31
if day == 0:
day = 31
print(' Month: ', month, 'n', 'Day: ', day, 'n', month, '/', day)

输出:

>>>186
Month:  6
Day:  31
6 / 31

最新更新