基于MATLAB的万年历计算
黄小川(200431610102)
测绘工程专业2004级9班
摘要:运用MATLAB编程实现1936—2032年农历与公历间的相互转换,并求当日是星期几。
关键词:万年历 公历转化为农历 农历转化为公历 求当天是星期几
正文:
1. 概述:知道公历年月日求农历日期,知道农历年月日求公历日期,并求当日是星期几。
2. 相关知识及原理:
公历:公历是现在国际通用的历法,又称格列历,通称阳历。公历将一年分为十二个月,其中一、三、五、七、八、十、十二月有31天,俗称“大月”;四、六、九、十一月有30天;平年二月有28天,闰年二月有29天,这样公历闰年一年有366天,平年有365天。
公历闰年:若一年年数不能被4整除,或能被100整除但不能被400整除,则称这一年为平年,否则为闰年。
农历:农历是基于对地球公转和月相变化的观测的。我国现采用的农历结合了阳历与阴历(伊斯兰历)的记年方法:一年有十二个月,其中6个大月(30天),6个小月(29天),一个农历年有354天。
农历闰月:为了平衡公里年与农历年的天数差别,农历采用在适当时候设立闰月的方法,一般三年左右设一闰月,闰月可以是大月,也可以是小月。具体设置原则由节气而定,方法较为复杂。
公历与农历间的转换:公历是纯数学的记年法,而农历是基于观测结果之上的。两者见的转换比较复杂,无法用简单的数学公式表示。因此,这里采用的方法是首先查得1936年至2032年相关的资料,包括:该年农历大年初一到公历元旦的天数、该年农历各月的天数、该年农历有无闰月以及在何处闰月。这样在公历化为农历时,只需算得改日距该年农历大年初一的天数,对应该年农历各月的天数,即可得到农历的月份,及该日在该农历月是第几天;在农历化为公历时,同样,需算得该日距该年元旦的天数,通过类似转化,即可求得公历日期。
求星期数:已知公历求星期数时,计算出改日距一特定日期的天数,则该日星期数=特定日期星期数+距离天数除以7的余数;已知农历时,只需将农历转换为公历,再由公历日期求星期数即可。
3. 实例计算:
3.1数据说明:
runyear 36到该年的闰年数
gongli_year %公历年数
gongli_mongth %公历月数
gongli_day %公历日期
gongli_sumofdays %公历各月累积天数
gongli_daysofyear %该日是该公历年的第几天
nongli_year %农历年数
nongli_month %农历月数
nongli_day %农历日期
nongli_sumofdays %农历各月累积天数
nongli_daysofyear %该日是该农历年的第几天
3.2MATLAB源程序:
%getdayofweek.m
%由公历日期求星期数
runyear=floor((gongli_year-1933)/4); %到1936年的闰年数
weekday=rem((gongli_year-1936-runyear)*365+runyear*366
+gongli_sumofdays(gongli_month)+gongli_day,7)+1; %求星期数
weekdayoutput=['二','三','四','五','六','日','一'];
fprintf('这一天是星期%s,',weekdayoutput(weekday))
%gongli_input
%输入公历日期
gongli_year=input('请输入一公历个年份:');
while (gongli_year-1936)*(gongli_year-2032)>0; %输入年份不符合要求
gongli_year=input('猪头!年份应在1936至2032之间,请再输一次:');
end
gongli_month=input('请输入一个公历月份:');
while (gongli_month-1)*(gongli_month-12)>0 %输入月份不符合要求
gongli_month=input('猪头!月份应在1至12之间,请再输一次:');
end
sign=0; %判断是否是闰年
if rem(gongli_year,4)==0
sign=sign+1;
end
if sign==1
gongli_sumofdays=[0,31,60,91,121,152,182,213,244,274,305,335,366];
else
gongli_sumofdays=[0,31,59,90,120,151,181,212,243,273,304,334,365];
end
gongli_day=input('请输入一个公历日期:');
while
(gongli_day-1)*(gongli_day-(gongli_sumofdays(gongli_month+1)
-gongli_sumofdays(gongli_month)))>0
gongli_day=input('猪头!这个月没有这个日期,请再输一次:');
end
%gongli2gongli.m
%将公历日期转化为农历日期
gongli_daysofyear&#