公历转换为农历的算法
- 格式:docx
- 大小:15.50 KB
- 文档页数:4
公历转换为农历的算法:
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<springFes){
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
}
}
}else{
if ($e(daystr,(i-1))=1){
;大月 30天
if (days<30){
s Nmonth=(i-1)
s Nday=days+1
q
}else{
s days=days-30
}
}else{
;小月 29天
if (days<29){
s Nmonth=(i-1)
s Nday=days+1
q
}else{
s days=days-29
}
}
}
}
}
Quit Nyear_"*"_Nmonth_"*"_Nday
}。