公历转换为农历的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
公历转换为农历的算法:
0101000101111 前12为代表大小月,第13位代表闰月的大小月
6 代表闰月的月份 0 代表无闰月
64311 代表当年春节的公历日期
1.首先获取当前日期。S time=+$h
2.判断查询日期是否在春节之前。如果是取上一年的信息。否则取当前年的信息为
农历年
3.
4.判断当前日期和最近的春节相差的天数。 Days
5.如果没有闰月,判断前12位的大小月,
如果是大月 ,则相差天数-30 如果是小月则相差天数-29,直到相差天数在30 或者 29天内。
取当前的月份,即农历的月份,天数+1 即为农历的天。
如果有闰月,判断前13位的大小月,判断方法和前面的类似,只是到闰月的月份时,需要在前面增加一个闰字。
/// gl 23/06/2016格式 gldays数字形式的日期
/// w ##class(websys.CalendarUtil).ToLuner("01/01/2017")
/// @param: gl 公历日期格式 DD/MM/YYYY
/// @return: 返回农历日期 2016*8*12 2017*闰6*12,2017*闰6*12 ClassMethod ToLuner(gl = {+$h})
{
//q "2016*8*12"
s Nmonth=""
s Nday=""
s ^TMP("Toluner")=$g(gl)
if gl=""{
set gldt=$h
set gldays=$p(gldt,",",1)
set gl=$zd(gldays,4)
}else{
set gldays=$zdh(gl,4)
}
;获取传过来的年份
set year=$p(gl,"/",3)
;查询数据库,获取这个年份的信息串
set calId=""
Set calId = $o(^websys.CalendarUtilI("YearIndex"," "_year,calId))
q:calId="" ""
s g=$list(^websys.CalendarUtilD(calId),1,3)
Set calInfo = $list(g,2)
b
;获取这个信息串的春节
s springFes=$p(calInfo,"^",3)
;如果要查询的日期在春节之前,获取前一年的信息串
if (gldays s year=(year-1) ;获取前一年信息串,取得春节 set calId="" Set calId = $o(^websys.CalendarUtilI("YearIndex"," "_year,calId)) set g=$list(^websys.CalendarUtilD(calId),1,3) Set calInfo = $list(g,2) set springFes=$p(calInfo,"^",3) } set Nyear=year set days=gldays-springFes set lmon=$p(calInfo,"^",2) set daystr=$p(calInfo,"^",1) b ; if (lmon=0){ ;无闰月 for i=1:1:12{ if ($e(daystr,i)=1){ ;大月 30天 if (days<30){ s Nmonth=i s Nday=days+1 q }else{ s days=days-30 } }else{ ;小月 29天 if (days<29){ s Nmonth=i s Nday=days+1 q }else{ s days=days-29 } } } }else{ for i=1:1:13 { if (i'>lmon){ if ($e(daystr,i)=1){ ;大月 30天 if (days<30){ s Nmonth=i s Nday=days+1 q }else{ s days=days-30 } }else{ ;小月 29天 if (days<29){ s Nmonth=i s Nday=days+1 q }else{ s days=days-29 } } } elseif (+i=+(lmon+1)){ if ($e(daystr,13)=1){ ;大月 30天 if (days<30){ s Nmonth="闰"_lmon s Nday=days+1 q }else{ s days=days-30 } }else{ ;小月 29天 if (days<29){ s Nmonth="闰"_lmon s Nday=days+1 q }else{ s days=days-29