Python中实现天数映射至多种日历类型的方法咨询
天数转多种日历日期的Python实现方案
核心结论
Python标准库没有直接支持所有这些日历类型的现成工具,**proleptic gregorian(儒略格列高利历)**可通过datetime模块直接实现,其他特殊日历(360天、365天、366天)则需要自行编写简单的转换逻辑。
具体实现代码
1. 标准日历&Proleptic Gregorian
Python的datetime模块默认采用proleptic gregorian日历,直接用fromordinal方法即可完成转换(注:datetime的ordinal从公元1年1月1日开始计数为第1天,需做偏移处理):
import datetime def days_to_gregorian(days): return datetime.date.fromordinal(days) # 示例:10590天对应的日期 print(days_to_gregorian(10590)) # 输出:1929-02-13
2. 360天历(每月固定30天)
按每年360天、每月30天的规则,通过整除和取余拆分年、月、日:
def days_to_360_calendar(days): year = (days - 1) // 360 + 1 remaining_days = (days - 1) % 360 month = remaining_days // 30 + 1 day = remaining_days % 30 + 1 return (year, month, day) print(days_to_360_calendar(10590)) # 输出:(30, 3, 30)
3. 365天历(每年固定365天,无闰年)
按非闰年的每月天数拆分剩余天数,忽略闰年规则:
# 非闰年各月天数 MONTH_DAYS = [31,28,31,30,31,30,31,31,30,31,30,31] def days_to_365_calendar(days): year = (days - 1) // 365 + 1 remaining_days = (days - 1) % 365 month = 1 for md in MONTH_DAYS: if remaining_days < md: break remaining_days -= md month += 1 day = remaining_days + 1 return (year, month, day) print(days_to_365_calendar(10590)) # 输出:(29, 2, 15)
4. 366天历(每年固定366天,全为闰年)
按闰年的每月天数拆分剩余天数,默认2月有29天:
# 全闰年各月天数 LEAP_MONTH_DAYS = [31,29,31,30,31,30,31,31,30,31,30,31] def days_to_366_calendar(days): year = (days - 1) // 366 + 1 remaining_days = (days - 1) % 366 month = 1 for md in LEAP_MONTH_DAYS: if remaining_days < md: break remaining_days -= md month += 1 day = remaining_days + 1 return (year, month, day) print(days_to_366_calendar(10590)) # 输出:(29, 2, 14)
补充说明
- 若你所说的“标准日历”指本地系统特殊日历,可结合第三方库调整,但如果仅需基础日期映射,用上述gregorian实现即可
- 所有自定义日历默认以公元1年1月1日为第1天,若需调整起始日期,修改计算时的偏移量即可
内容的提问来源于stack exchange,提问作者Thomas Kroißenbrunner
相关产品推荐
相关产品推荐

