算法将365天转换为月日和月日(波斯日历)

2024-09-29 21:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我想写一个算法,将数字转换成日和月,例如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号,应该有另一个if,因为它应该显示31/6而不是0/7,我找不到解决方案


Tags: and代码算法inputif数字daysint
2条回答

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

使用标准库

使用模块datetime:为一月一日定义一个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

我们需要硬编码每月的天数。然后我们将累积这些天数,得到每个月最后一天的天数;最后,我们将比较我们的天数和这些数字。我们可以使用^{}。如果您对标准库中的模块过敏,可以编写自己的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个月的代码,包括以下两项更改:

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

相关问题 更多 >

    热门问题