大家好,我想写一个算法来将数字转换为日和月,例如,使用波斯日历,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