公历转换为农历的算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档